Practiced hand
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#defineMAXV 100500#defineMaxe 200500using namespacestd;Long LongN,q,x,y,z,g[maxv],nume=1, dis[maxv],top[maxv],fath[maxv],son[maxv],size[maxv],dfn[maxv],mx[maxv],times=0;structedge{Long LongV,NXT;} E[maxe];Long Longls[maxv<<2],rs[maxv<<2],val[maxv<<2],lazy[maxv<<2],sum[maxv<<2],tot=0, Root;Chars[Ten];voidAddedge (Long LongULong Longv) {e[++nume].v=v; E[NUME].NXT=G[u]; G[u]=Nume;}voidDFS1 (Long Longx) {Size[x]=1; son[x]=0; for(Long LongI=g[x];i;i=e[i].nxt) { Long Longv=e[i].v; if(v!=Fath[x]) {Fath[v]=x;dis[v]=dis[x]+1; DFS1 (v); SIZE[X]+=Size[v]; if(Size[son[x]]<size[v]) son[x]=v; } }}voidDFS2 (Long LongXLong Longfather) {Top[x]=father;dfn[x]=mx[x]=++Times ; if(Son[x]) {DFS2 (son[x],father); mx[x]=Max (mx[x],mx[son[x]);} for(Long LongI=g[x];i;i=e[i].nxt) { Long Longv=e[i].v; if((V!=fath[x]) && (v!=Son[x])) {DFS2 (v,v); MX[X]=Max (Mx[x],mx[v]); } }}voidBuildLong Long&now,Long LongLeftLong LongRight ) { Now=++tot; if(Left==right)return; Long LongMid= (left+right) >>1; Build (Ls[now],left,mid); Build (Rs[now],mid+1, right);}voidPushdown (Long LongNowLong LongLeftLong LongRight ) { if(!lazy[now])return; Long LongMid= (left+right) >>1; Lazy[ls[now]]+=lazy[now];sum[ls[now]]+= (mid-left+1)*Lazy[now]; Lazy[rs[now]]+=lazy[now];sum[rs[now]]+= (RIGHT-MID) *Lazy[now]; Lazy[now]=0;}voidModifyLong LongNowLong LongLeftLong LongRightLong LongLLong LongRLong Longval) {pushdown (now,left,right); if((left==l) && (right==r)) {Lazy[now]+=val;sum[now]+= (right-left+1)*Val; return; } Long LongMid= (left+right) >>1; if(r<=mid) Modify (Ls[now],left,mid,l,r,val); Else if(l>=mid+1) Modify (rs[now],mid+1, Right,l,r,val); Else{Modify (Ls[now],left,mid,l,mid,val); Modify (Rs[now],mid+1, right,mid+1, R,val); } Sum[now]=sum[ls[now]]+Sum[rs[now]];}voidAdd () {Long LongF1=top[x],f2=Top[y]; while(f1!=F2) { if(dis[f1]<Dis[f2]) {swap (F1,F2); swap (x, y);} Modify (Root,1, n,dfn[f1],dfn[x],z); X=fath[f1];f1=Top[x]; } if(dis[x]>Dis[y]) swap (x, y); Modify (Root,1, n,dfn[x],dfn[y],z);}Long LongQueryLong LongNowLong LongLeftLong LongRightLong LongLLong LongR) {pushdown (now,left,right); if((left==l) && (right==r))returnSum[now]; Long LongMid= (left+right) >>1; if(R<=mid)returnquery (LS[NOW],LEFT,MID,L,R); Else if(l>=mid+1)returnQuery (rs[now],mid+1, Right,l,r); Else returnQuery (Ls[now],left,mid,l,mid) +query (rs[now],mid+1, right,mid+1, R);}voidAsk () {printf ("%lld\n", Query (Root,1, n,dfn[x],mx[x]));}intMain () {scanf ("%lld",&N); for(Long LongI=1; i<=n-1; i++) {scanf ("%lld%lld", &x,&y); x++;y++; Addedge (x, y); Addedge (y,x); } DFS1 (1); DFS2 (1,1); Build (Root,1, N); scanf ("%lld",&q); for(Long LongI=1; i<=q;i++) {scanf ("%s", s); if(s[0]=='A') {scanf ("%lld%lld%lld", &x,&y,&z); x++;y++; Add (); } Else{scanf ("%lld", &x); x + +; Ask (); } } return 0;}
Bzoj 2836 Magic Tree