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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <vector> #define init(x) memset (x,0,sizeof (x)) #define ll long long #define ull unsigned long long #define INF 0x3f3f3f3f #define lowbit(x) x & (-x) using namespace std; const int MAX = 2e5 + 5; const int MOD = 1e9 + 7; inline int read (); int n,m,cnt,in[MAX],out[MAX],top[MAX],sz[MAX],hson[MAX],f[MAX],dep[MAX],dp[MAX][25],c[25][MAX]; vector <int> ve[MAX]; void dfs1 (int u,int fa); void dfs2 (int u,int fa); int lca (int u,int v); void modify (int tr[],int x,int v); int query (int tr[],int x); int main () { n = read (); for (int i = 1;i < n;++i) { int x = read (),y = read (); ve[x].push_back (y);ve[y].push_back (x); } dfs1 (1,0); in[1] = ++cnt,top[1] = 1; dfs2 (1,0); m = read (); for (int i = 1;i <= m;++i) { int ty = read (); if (ty == 1) { int x = read (),ans = 0,p = 0; for (int i = 0;i <= 20;++i) { ans += query (c[i],out[x]) - query (c[i],in[x] - 1); for (int j = p;j <= 20;++j) ans += dp[x][j]; ++p;x = f[x]; if (!x) break; } printf ("%d\n",ans); } else { int u = read (),v = read (),k = read (),d = read (); int z = lca (u,v); modify (c[d],in[u],k);modify (c[d],in[v],k);modify (c[d],in[z],-2 * k); for (int i = d;~i;--i) { dp[z][i] += k; if (i - 2 >= 0 && f[z]) dp[z][i - 2] -= k; z = f[z]; if (!z) break; } } } return 0; } inline int read () { int s = 0;int f = 1; char ch = getchar (); while ((ch < '0' || ch > '9') && ch != EOF) { if (ch == '-') f = -1; ch = getchar (); } while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar (); } return s * f; } void dfs1 (int u,int fa) { dep[u] = dep[fa] + 1; f[u] = fa;sz[u] = 1; for (auto v : ve[u]) { if (v == fa) continue; dfs1 (v,u); sz[u] += sz[v]; if (sz[v] > sz[hson[u]]) hson[u] = v; } } void dfs2 (int u,int fa) { if (hson[u]) { in[hson[u]] = ++cnt; top[hson[u]] = top[u]; dfs2 (hson[u],u); } for (auto v : ve[u]) { if (top[v]) continue; in[v] = ++cnt; top[v] = v; dfs2 (v,v); } out[u] = cnt; } int lca (int u,int v) { int fx = top[u],fy = top[v]; while (fx != fy) { if (dep[fx] < dep[fy]) swap (fx,fy),swap (u,v); u = f[fx],fx = top[u]; } if (dep[u] > dep[v]) swap (u,v); return u; } void modify (int tr[],int x,int v) {for (int i = x;i <= n;i += lowbit (i)) tr[i] += v;} int query (int tr[],int x) {int sum = 0;for (int i = x;i;i -= lowbit (i)) sum += tr[i];return sum;}
|