inlineint __read() { intx(0), t(1); charo(getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) x = (x << 1) + (x << 3) + (o ^ 48); return x * t; }
int n, m, p[maxn], f[maxn]; int dp[maxn][2], cur; int head[maxn], edge[maxn << 1], __next[maxn << 1];
inlinevoidAddEdge(int u, int v) { __next[++cur] = head[u]; head[u] = cur; edge[cur] = v; }
inlinevoiddfs(int u, int fa) { dp[u][1] = p[u], dp[u][0] = 0; f[u] = fa; for (inti(head[u]); i; i = __next[i]) { if (edge[i] == fa) continue; dfs(edge[i], u); dp[u][0] += max(dp[edge[i]][0], dp[edge[i]][1]); dp[u][1] += dp[edge[i]][0]; } }
signedmain() { n = __read(), m = __read(); for (int i = 1; i <= n; ++i) p[i] = __read(); for (int i = 1; i < n; ++i) { int a = __read(), b = __read(); AddEdge(a, b), AddEdge(b, a); } dfs(1, 0); for (int i = 1; i <= n; ++i) { int x = __read(), val = __read(); int update = val - p[x]; p[x] += update; int lst = x; int l0 = dp[x][0], l1 = dp[x][1]; dp[x][1] += update; x = f[x]; while (x) { int t0 = dp[x][0], t1 = dp[x][1]; dp[x][0] -= max(l0, l1); dp[x][0] += max(dp[lst][0], dp[lst][1]); dp[x][1] += dp[lst][0] - l0; l0 = t0, l1 = t1; lst = x; x = f[x]; } int ans = max(dp[1][1], dp[1][0]); printf ("%d\n", ans); } system("pause"); }//真挺暴力的