#include<bits/stdc++.h> using namespace std; #define N 800000 int n,m,x,y,op,clk,head[N],tot,sz[N],fa[N],top[N],dfn[N]; struct edge{int v,nxt;}e[N]; struct tag{ int a,b,c; tag():a(0),b(0),c(0){} tag(int x,int y,int z):a(x),b(y),c(z){} void operator +=(const tag &t){ c+=t.c-t.a*b; a+=t.a; b+=t.b; } }seg[N]; void adde(int x,int y){e[++tot].v=y; e[tot].nxt=head[x]; head[x]=tot;} void dfs1(int u){ sz[u]=1; for (int i=head[u],v;i;i=e[i].nxt) if ((v=e[i].v)!=fa[u]){ fa[v]=u; dfs1(v); sz[u]+=sz[v]; } } void dfs2(int u){ dfn[u]=++clk; if (!top[u]) top[u]=u; int t=0; for (int i=head[u],v;i;i=e[i].nxt) if ((v=e[i].v)!=fa[u] && sz[v]>sz[t]) t=v; if (!t) return; top[t]=top[u]; dfs2(t); for (int i=head[u],v;i;i=e[i].nxt) if ((v=e[i].v)!=fa[u] && v!=t) dfs2(v); } #define ls x<<1 #define rs x<<1|1 void psd(int x){ seg[ls]+=seg[x]; seg[rs]+=seg[x]; seg[x]=tag(); } void mdf(int x,int l,int r,int L,int R,tag k){ if (l>=L && r<=R){seg[x]+=k; return;} psd(x); int mid=(l+r)>>1; if (L<=mid) mdf(ls,l,mid,L,R,k); if (R>mid) mdf(rs,mid+1,r,L,R,k); } int qry(int x,int l,int r,int k){ if (l==r) return seg[x].a*seg[x].b+seg[x].c; psd(x); int mid=(l+r)>>1; if (k<=mid) return qry(ls,l,mid,k); else return qry(rs,mid+1,r,k); } #undef ls #undef rs void add(int x,int y){ while (top[x]){ mdf(1,1,n,dfn[top[x]],dfn[x],tag(y,0,0)); x=fa[top[x]]; } } void mul(int x,int y){ while (top[x]){ mdf(1,1,n,dfn[top[x]],dfn[x],tag(0,y,0)); x=fa[top[x]]; } } int main(){ scanf("%d",&n); for (int i=1;i<n;i++){ scanf("%d%d",&x,&y); adde(x,y); adde(y,x); } dfs1(1); dfs2(1); scanf("%d",&m); for (int i=1;i<=m;i++){ scanf("%d",&op); if (op==1){ scanf("%d%d",&x,&y); add(x,y); } if (op==2){ scanf("%d%d",&x,&y); mul(x,y); } if (op==3){ scanf("%d",&x); printf("%d\n",qry(1,1,n,dfn[x])); } } return 0; }
|