1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| #include <bits/stdc++.h> using namespace std;
typedef long long ll; const int N = 1e6 + 5;
int n, m, r, v[N]; struct Bit { ll t1[N], t2[N]; int lowbit(int x) { return x & -x; } void add(int x, ll k) { for (int i = x; i <= n; i += lowbit(i)) t1[i] += k, t2[i] += k * 1ll * (x - 1); } void upd(int l, int r, ll k) { add(l, k); add(r + 1, -k); } ll sum(int x) { ll ans = 0; for (int i = x; i; i -= lowbit(i)) ans += x * 1ll * t1[i] - t2[i]; return ans; } ll qry(int l, int r) { return sum(r) - sum(l - 1); } } b1, b2;
vector<int> e[N];
int siz[N], son[N], top[N], fa[N], dfn[N], rnk[N], dep[N], dfs-clock; void dfs1(int u, int f) { dep[u] = dep[f] + 1; siz[u] = 1; fa[u] = f; for (int v : e[u]) { if (v == f) continue; dfs1(v, u); siz[u] += siz[v]; if (son[u] == 0 || siz[son[u]] < siz[v]) son[u] = v; } } void dfs2(int u, int tp) { dfn[u] = ++dfs-clock, rnk[dfs-clock] = u, top[u] = tp; if (son[u]) dfs2(son[u], tp); for (int v : e[u]) { if (v == fa[u] || v == son[u]) continue; dfs2(v, v); } } int lca(int u, int v) { while (top[u] != top[v]) { if (dep[top[u]] < dep[top[v]]) swap(u, v); u = fa[top[u]]; } if (dep[u] < dep[v]) swap(u, v); return v; } int read() { int w = 0, f = 1; char ch = getchar(); while (ch > '9' || ch < '0') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { w = w * 10 + ch - 48; ch = getchar(); } return w * f; }
int main() { n = read(), m = read(), r = read(); for (int i = 1; i <= n; i++) v[i] = read(); for (int i = 1; i < n; i++) { int u, v; u = read(), v = read(); e[u].push-back(v); e[v].push-back(u); } dfs1(r, 0), dfs2(r, r); for (int i = 1; i <= n; i++) { b1.upd(dfn[i], dfn[i], v[i]); b2.upd(dfn[i], dfn[i], v[i] * 1ll * dep[i]); if (i != r) b1.upd(dfn[fa[i]], dfn[fa[i]], -v[i]), b2.upd(dfn[fa[i]], dfn[fa[i]], -dep[fa[i]] * 1ll * v[i]); } for (int i = 1; i <= m; i++) { int op, a, b, x; op = read(), a =read(); if (op == 1) { b = read(), x = read(); int LCA = lca(a, b); b1.upd(dfn[b], dfn[b], x); b1.upd(dfn[a], dfn[a], x); b1.upd(dfn[LCA], dfn[LCA], -x); b2.upd(dfn[b], dfn[b], dep[b] * 1ll * x); b2.upd(dfn[a], dfn[a], dep[a] * 1ll * x); b2.upd(dfn[LCA], dfn[LCA], -dep[LCA] * 1ll * x); if (LCA != r) b1.upd(dfn[fa[LCA]], dfn[fa[LCA]], -x), b2.upd(dfn[fa[LCA]], dfn[fa[LCA]], -dep[fa[LCA]] * 1ll * x); } else if (op == 2) printf("%lld\n", b1.qry(dfn[a], dfn[a] + siz[a] - 1)); else { ll res = -b1.qry(dfn[a], dfn[a] + siz[a] - 1) * 1ll * (dep[a] - 1); res += b2.qry(dfn[a], dfn[a] + siz[a] - 1); printf("%lld\n", res); } } return 0; }
|