1 条题解
-
0
2025/3/19
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6 + 5; int n, m, R, dfn[maxn], idx, id[maxn], val[maxn], sz[maxn]; vector<int> g[maxn]; void dfs(int u, int p) { dfn[u] = ++idx; id[idx] = u; sz[u] = 1; for (auto v : g[u]) if (v != p) dfs(v, u), sz[u] += sz[v]; } long long tr[maxn<<2], lazy[maxn<<2]; void push_up(int u) { tr[u] = tr[u<<1] + tr[u<<1|1]; } void push_down(int l, int r, int u) { if (lazy[u]) { int mid = (l + r) / 2; // [l, mid] mid-l+1 tr[u<<1] += lazy[u] * (mid - l + 1); lazy[u<<1] += lazy[u]; // [mid+1, r] r-mid tr[u<<1|1] += lazy[u] * (r - mid); lazy[u<<1|1] += lazy[u]; lazy[u] = 0; } } void build(int l, int r, int u) { if (l == r) { tr[u] = val[id[l]]; return; } int mid = (l + r) / 2; build(l, mid, u<<1); build(mid+1, r, u<<1|1); push_up(u); } void add(int L, int R, long long x, int l, int r, int u) { if (L <= l && r <= R) { tr[u] += x * (r - l + 1); lazy[u] += x; return; } push_down(l, r, u); int mid = (l + r) / 2; if (L <= mid) add(L, R, x, l, mid, u<<1); if (R > mid) add(L, R, x, mid+1, r, u<<1|1); push_up(u); } long long query(int L, int R, int l, int r, int u) { if (L <= l && r <= R) return tr[u]; push_down(l, r, u); long long res = 0; int mid = (l + r) / 2; if (L <= mid) res += query(L, R, l, mid, u<<1); if (R > mid) res += query(L, R, mid+1, r, u<<1|1); return res; } int main() { scanf("%d%d%d", &n, &m, &R); for (int i = 1; i <= n; i++) scanf("%d", val+i); for (int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); g[u].push_back(v); g[v].push_back(u); } dfs(R, -1); build(1, n, 1); while (m--) { int op, a, x; scanf("%d%d", &op, &a); if (op == 1) { scanf("%d", &x); add(dfn[a], dfn[a] + sz[a] - 1, x, 1, n, 1); } else { printf("%lld\n", query(dfn[a], dfn[a] + sz[a] - 1, 1, n, 1)); } } return 0; }
- 1
信息
- ID
- 37
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 13
- 已通过
- 4
- 上传者