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
| #include<bits/stdc++.h> typedef long long LL; using namespace std; const int MAXN = 1e6+10; const int MAXM = 2e6+10; LL w[MAXN]; // N结点个数, R根结点index, M操作组数 int N,M,R; struct Edge{ int to,next=0; }es[MAXM]; int tot = 1; int head[MAXN]={0}; int iindex = 1; int dfn[MAXN]={0}; int l[MAXN]={0}; int r[MAXN]={0}; LL sum[MAXN]={0}; void init(){ fill(head,head+N,0); }
//void getPreSum(){ // for(int i = 1;i<=N;i++){ // sum[i]=sum[i-1]+w[dfn[i]]; // } //} //链式前向星构建树 void buildTree(){ for(int i = 1;i<=N-1;i++){ int u,v; scanf("%d %d",&u,&v); es[tot].to = v; es[tot].next = head[u]; head[u]=tot++; es[tot].to = u; es[tot].next = head[v]; head[v]=tot++; } } //生成dfs序 void dfs(int u, int f){ // printf("*****%d\n",u); dfn[iindex]=u; l[u]=iindex; iindex++; for(int i = head[u];i!=0;i=es[i].next){ if(es[i].to!=f) dfs(es[i].to, u); } r[u]=iindex-1; } void op1(int a,int x){ w[a]+=x; //getPreSum(); } void op2(int a){ LL sum1 = 0; for(int i = l[a];i<=r[a];i++){ sum1+=w[dfn[i]]; } printf("%lld\n",sum1); } int main(){ init(); scanf("%d %d %d",&N,&M,&R); for(int i = 1;i<=N;i++){ scanf("%lld", &w[i]); } buildTree(); dfs(R,-1); //getPreSum(); // for(int i = 1;i<=N;i++){ // printf("%d ",sum[i]); // } for(int i = 0;i<M;i++){ int op; scanf("%d",&op); if(op==1){ int a,x; scanf("%d %d",&a,&x); op1(a,x); }else{ int a; scanf("%d",&a); op2(a); } } return 0; }
|