如果这题只传到儿子不继续向下就是裸的dfs序+线段树,继续往下传的还改变正负号,我们可以根据它的层数来确定正负号
1 #include<bits/stdc++.h> 2 3 #define inf 0x3f3f3f3f 4 5 #define lson (id<<1) 6 7 #define rson ((id<<1)|1) 8 9 #define mid ((l+r)>>1) 10 11 const int maxn=200000; 12 13 using namespace std; 14 15 int t; 16 17 int p; 18 19 int n,m; 20 21 int u,v; 22 23 int x,val; 24 25 int dep[maxn+10]; 26 27 int a[maxn+10]; 28 29 int pos[maxn+10]; 30 31 int q[maxn+10]; 32 33 int son[maxn+10]; 34 35 int tree[maxn*4+10]; 36 37 int sum[maxn*4+10]; 38 39 int lazy[maxn*4+10]; 40 41 vector<int> G[maxn+10]; 42 43 void push_up(int id){ 44 tree[id]=tree[lson]+tree[rson]; 45 } 46 47 void push_down(int id,int l,int r){ 48 if(lazy[id]){ 49 lazy[lson]+=lazy[id]; 50 lazy[rson]+=lazy[id]; 51 tree[lson]+=(mid-l+1)*lazy[id]; 52 tree[rson]+=(r-mid)*lazy[id]; 53 lazy[id]=0; 54 } 55 return ; 56 } 57 58 void build(int id,int l,int r){ 59 if(l==r){ 60 sum[id]=a[pos[l]]; 61 return ; 62 } 63 build(lson,l,mid); 64 build(rson,mid+1,r); 65 push_up(id); 66 return ; 67 } 68 69 void update(int id,int l,int r,int x,int y,int val){ 70 if(l==x&&r==y){ 71 tree[id]+=val*(r-l+1); 72 lazy[id]+=val; 73 return ; 74 } 75 push_down(id,l,r); 76 if(x>mid){ 77 update(rson,mid+1,r,x,y,val); 78 } else if(y<=mid){ 79 update(lson,l,mid,x,y,val); 80 } else { 81 update(lson,l,mid,x,mid,val); 82 update(rson,mid+1,r,mid+1,y,val); 83 } 84 } 85 86 int fi(int id,int l,int r,int x){ 87 if(l==r){ 88 int temp=dep[pos[l]]&1; 89 if(!temp) temp=-1; 90 return sum[id]+lazy[id]*temp; 91 } 92 push_down(id,l,r); 93 if(x<=mid){ 94 return fi(lson,l,mid,x); 95 } else { 96 return fi(rson,mid+1,r,x); 97 } 98 } 99 100 void dfs(int x,int fa,int d){ 101 dep[x]=d; 102 pos[++p]=x; 103 q[x]=p; 104 for(size_t i=0;i<G[x].size();i++){ 105 if(G[x][i]==fa) continue; 106 dfs(G[x][i],x,d+1); 107 son[x]++; 108 son[x]+=son[G[x][i]]; 109 } 110 } 111 112 int main() 113 { 114 scanf("%d%d",&n,&m); 115 for(int i=1;i<=n;i++){ 116 scanf("%d",&a[i]); 117 } 118 for(int i=1;i<n;i++){ 119 scanf("%d%d",&u,&v); 120 G[u].push_back(v); 121 G[v].push_back(u); 122 } 123 dfs(1,0,1); 124 build(1,1,n); 125 for(int i=1;i<=m;i++){ 126 scanf("%d",&t); 127 if(t==1){ 128 scanf("%d%d",&x,&val); 129 if(dep[x]&1) 130 update(1,1,n,q[x],q[x]+son[x],val); 131 else update(1,1,n,q[x],q[x]+son[x],-val); 132 } else { 133 scanf("%d",&x); 134 int ans=fi(1,1,n,q[x]); 135 printf("%d ",ans); 136 } 137 } 138 return 0; 139 }