#include <bits/stdc++.h> using namespace std; template <typename T> inline void read(T &a){ T w=1; a=0; char ch=getchar(); for(;ch < '0' || ch > '9';ch=getchar()) if(ch == '-') w=-1; for(;ch>='0'&&ch<='9';ch=getchar()) a=(a<<3)+(a<<1)+(ch^48); a*=w; } template <typename T> inline void ckmax(T &a, T b){a = a > b ? a : b;} template <typename T> inline void ckmin(T &a, T b){a = a < b ? a : b;} #define int unsigned int long long #define fi first #define se second #define pb push_back #define mp make_pair #define pii pair<int, int> #define vi vector<int> #define wife puts("MckennaGrace") #define Debug(x) cout << #x << " = " << x << endl #define For(i,l,r) for (int i = l; i <= r; ++i) #define foR(i,l,r) for (int i = l; i >= r; --i) const int N = 1e5 + 10; struct edge { int to, nxt; } e[N << 1]; int head[N], cnt, val[N]; inline void add (int u, int v) { e[++cnt].to = v; e[cnt].nxt = head[u]; head[u] = cnt; }
int n, m, rt; int dfn[N], dfntot, low[N]; struct BIT { int sum[N]; inline void upd (int x, int v) { for (int i = x; i <= n; i += (i & (-i))) sum[i] += v; } inline int ask (int x) { int Ans = 0; for (int i = x; i; i -= (i & (-i))) Ans += sum[i]; return Ans; } } tr; int Sum[N]; void dfs (int u, int fa) { dfn[u] = ++dfntot; Sum[u] = val[u]; for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; if (v == fa) continue; dfs(v, u); Sum[u] += Sum[v]; } low[u] = dfntot; } int bel[N], siz, blo, Ans[N]; int To[N][318]; void dfs1 (int u, int fa) { To[u][bel[u] - 1]++; for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; if (v == fa) continue; For (j, 0, blo - 1) To[v][j] += To[u][j]; dfs1(v, u); } }
inline void work (int u, int v) { For (i, 0, blo - 1) { int x = To[u][i]; Ans[i + 1] += x * (v - val[u]); } tr.upd(dfn[u], v - val[u]); val[u] = v; }
inline int sol (int l, int r) { int ret = 0; if (bel[l] == bel[r]) { For (i, l, r) ret += tr.ask(low[i]) - tr.ask(dfn[i] - 1); return ret; } For (i, bel[l] + 1, bel[r] - 1) ret += Ans[i]; For (i, l, min(n, bel[l] * siz)) ret += tr.ask(low[i]) - tr.ask(dfn[i] - 1); For (i, (bel[r] - 1) * siz + 1, r) ret += tr.ask(low[i]) - tr.ask(dfn[i] - 1);
return ret; }
signed main() { read(n), read(m); For (i, 1, n) read(val[i]); For (i, 1, n) { int u, v; read(u); read(v); if (!u) rt = v; else add(u, v), add(v, u); } dfs(rt, 0); For (i, 1, n) tr.upd(dfn[i], val[i]); siz = sqrt (n), blo = n / siz; for (int i = 1; i <= blo; ++i) For (j, (i - 1) * siz + 1, i * siz) bel[j] = i, Ans[i] += Sum[j]; if (blo * siz < n){ For (i, blo * siz + 1, n) bel[i] = blo + 1; blo++; } dfs1(rt, 0); while (m--) { int opt, u, v; read(opt); read(u); read(v); if (opt == 1) work (u, v); else printf ("%llu\n", sol(u, v)); } return 0; }
|