-------------------------我是代码的分割线-------------------
#include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") const int maxn = 112345; #define lson o<<1,l,m #define rson o<<1|1,m+1,r #define Mid int m = (l+r)>>1 #define root 1,1,n #define Now int o,int l,int r #define LL long long int arr[maxn]; int aar[maxn]; LL sum[maxn]; int lazy[maxn*4]; LL val[maxn*4]; void sinit(int n){ memset(lazy,0,sizeof(lazy)); memset(val,0,sizeof(val)); sum[0]=0; for(int i=1;i<=n;i++){ sum[i]=sum[i-1]+arr[i]; } } void maintain(Now){ lazy[o]=1; val[o]=sum[r]-sum[l-1]; } void update(Now,int ul,int ur){ if(ul<=l && r<=ur){ maintain(o,l,r); return; } Mid; if(lazy[o]==1){ return; } if(ul<=m) update(lson,ul,ur); if(m+1<=ur) update(rson,ul,ur); val[o]=val[o<<1]+val[o<<1|1]; } void update(Now,int pos){ // printf("pos = %d\n",pos); if(l==r){ lazy[o]=val[o]=0; return; } Mid; if(lazy[o]==1){ lazy[o]=0; maintain(lson); maintain(rson); } if(pos<=m) update(lson,pos); else update(rson,pos); val[o]=val[o<<1]+val[o<<1|1]; } vector<int> edge[maxn]; void init(int n){ for(int i=0;i<=n;i++) edge[i].resize(0); } void Link(int st,int ed){ edge[st].push_back(ed); edge[ed].push_back(st); } int fa[maxn],son[maxn],tid[maxn],siz[maxn],top[maxn],deep[maxn]; int _cnt; void dffs(int st,int Fa,int Deep){ deep[st]=Deep,son[st]=-1,siz[st]=1,fa[st]=Fa; for(auto & x:edge[st]){ if(x!=Fa){ dffs(x,st,Deep+1); siz[st]+=siz[x]; if(son[st]==-1 || siz[son[st]]<siz[x]) son[st]=x; } } } void dfss(int st,int Top){ tid[st]=_cnt++,top[st]=Top; if(son[st]!=-1) dfss(son[st],Top); for(auto & x:edge[st]){ if(x!=fa[st] && x!=son[st]){ dfss(x,x); } } } void tinit(){ _cnt=1; dffs(1,0,1); dfss(1,1); } void UPD(int x,int y,int n){ int tx = top[x],ty=top[y]; while(tx!=ty){ if(deep[tx] > deep[ty]){ // up x update(root,tid[tx],tid[x]); x=fa[tx],tx=top[x]; } else{ update(root,tid[ty],tid[y]); y=fa[ty],ty=top[y]; } // printf("x = %d y = %d\n",x,y); } if(deep[x]>deep[y]){ update(root,tid[y],tid[x]); } else{ update(root,tid[x],tid[y]); } } void UPD(int x,int n){ int id = tid[x]; int size = siz[x]; update(root,id,id+size-1); } int main(){ int n,m; int T; scanf("%d",&T); while(T-- && ~scanf("%d",&n)){ for(int i=1;i<=n;i++) scanf("%d",&aar[i]); int u,v; init(n); for(int i=1;i<n;i++){ scanf("%d %d",&u,&v); Link(u,v); } tinit(); for(int i=1;i<=n;i++){ arr[tid[i]]=aar[i]; } // for(int i=1;i<=n;i++) // printf(i<n?"%d ":"%d\n",tid[i]); // for(int i=1;i<=n;i++) // printf(i<n?"%d ":"%d\n",top[i]); sinit(n); scanf("%d",&m); int ord; while(m--){ scanf("%d",&ord); if(ord==1){ scanf("%d %d",&u,&v); UPD(u,v,n); } else if(ord==2){ scanf("%d",&u); update(root,tid[u]); } else{ scanf("%d",&u); UPD(u,n); } printf("%lld\n",val[1]); } } return 0; } /* 1 10 1 2 3 4 5 6 7 8 9 10 1 2 1 3 2 4 2 5 5 9 5 10 3 6 3 7 3 8 6 1 10 4 1 9 7 2 5 3 4 2 4 1 6 10 1 5 5 5 5 5 5 1 2 1 3 1 4 1 5 10086 3 1 10086 2 1 10 1 2 10086 */