Code:
#include<bits/stdc++.h>
#define LL long long
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define Fcin \
ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const int N = 1e6 + 10;
int n, Q, dfn[N], sz[N], R[N], A[N];
LL B[N];
vector<int> G[N];
int tot = 0;
void DFS(LL x, LL fa){
dfn[x] = ++ tot;
for (int it : G[x]){
if (it != fa){
DFS(it, x);
sz[x] += sz[it];
}
}
sz[x] ++;
R[x] = dfn[x] + sz[x] - 1;
return ;
}
LL tree[(int)(2.5 * N)];
void pushup(LL p) { tree[p] = tree[ls(p)] + tree[rs(p)]; }
void update(int p, int l, int r, int x, int k){
if (l == r && l == x){ tree[p] += k; return ; }
int mid = (l + r) >> 1;
if (x <= mid)
update(ls(p), l, mid, x, k);
if (x >= mid + 1)
update(rs(p), mid + 1, r, x, k);
pushup(p);
return ;
}
LL query(int p, int l, int r, int x, int y){
if (x <= l && y >= r){ return tree[p]; }
int mid = (l + r) >> 1; LL ret = 0;
if (x <= mid)
ret += query(ls(p), l, mid, x, y);
if (y >= mid + 1)
ret += query(rs(p), mid + 1, r, x, y);
return ret;
}
int rt;
int main(){
Fcin;
cin >> n >> Q >> rt;
for (int i = 1; i <= n; i ++)
cin >> A[i];
int u, v, opt;
for (int i = 1; i < n; i ++) { cin >> u >> v; G[u].emplace_back(v); G[v].emplace_back(u); }
DFS(rt, 0);
for (int i = 1; i <= n; i ++){
B[dfn[i]] = A[i];
}
for (int i = 1; i <= n; i ++){
B[i] += B[i - 1];
}
while (Q --){
cin >> opt >> u;
if (opt == 1){
cin >> v;
update(1, 1, n, dfn[u], v);
}
else { cout << query(1, 1, n, dfn[u], R[u]) + B[R[u]] - B[dfn[u] - 1] << "\n"; }
}
return 0;
}
测试点时间: 17ms / 415ms / 1554ms / 2739ms / 2446ms
共 1 条回复
333