Codeforces Round #225 (Div. 2) E. Propagating tree dfs序+-线段树
题目链接:点击传送
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define ll long long #define pi (4*atan(1.0)) #define eps 1e-14 #define bug(x) cout<<"bug"<<x<<endl; const int N=2e5+10,M=4e6+10,inf=2147483647; const ll INF=1e18+10,mod=1e9+7; /// 数组大小 struct is { int v,next; }edge[N<<1]; int head[N],edg,a[N]; void init() { memset(head,-1,sizeof(head)); edg=0; } void add(int u,int v) { edg++; edge[edg].v=v; edge[edg].next=head[u]; head[u]=edg; } int in[N],out[N],tot,deep[N]; void dfs(int u,int fa,int dep) { in[u]=++tot; deep[u]=dep; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(v==fa)continue; dfs(v,u,dep+1); } out[u]=tot; } /// 线段树 struct SGT { int TL[N<<2],TR[N<<2],ans; void build(int l,int r,int pos) { TL[pos]=TR[pos]=0; if(l==r)return; int mid=(l+r)>>1; build(l,mid,pos<<1); build(mid+1,r,pos<<1|1); } void update(int L,int R,int c,int dep,int l,int r,int pos) { if(L<=l&&r<=R) { if(dep&1) { TL[pos]+=c; TR[pos]-=c; } else { TL[pos]-=c; TR[pos]+=c; } return; } int mid=(l+r)>>1; if(L<=mid) update(L,R,c,dep,l,mid,pos<<1); if(R>mid) update(L,R,c,dep,mid+1,r,pos<<1|1); } void query(int p,int dep,int l,int r,int pos) { if(dep&1) ans+=TL[pos]; else ans+=TR[pos]; if(l==r)return; int mid=(l+r)>>1; if(p<=mid) query(p,dep,l,mid,pos<<1); else query(p,dep,mid+1,r,pos<<1|1); } }; SGT tree; int main() { init(); int n,q; scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v),add(v,u); } dfs(1,-1,1); tree.build(1,n,1); while(q--) { int t; scanf("%d",&t); if(t==1) { int x,c; scanf("%d%d",&x,&c); tree.update(in[x],out[x],c,deep[x],1,n,1); } else { int x; scanf("%d",&x); tree.ans=0; tree.query(in[x],deep[x],1,n,1); printf("%d\n",tree.ans+a[x]); } /*for(int i=1;i<=n;i++) { tree.ans=0; tree.query(in[i],deep[i],1,n,1); printf("%d ",tree.ans+a[i]); } printf("\n");*/ } return 0; }