#include<bits/stdc++.h> using namespace std; #define LL long long #define N 300000 #define INF 0x3f3f3f3f3f3f3f3fLL LL n,m,x,y,fa[N],sz[N],top[N],but[N],dfn[N],head[N],tot,clk,c[N]; char ch; bool mk[N]; struct edge{LL v,nxt;}e[N*2]; void adde(LL x,LL y){e[++tot].v=y; e[tot].nxt=head[x]; head[x]=tot;} struct trans{ LL a,b; trans():a(0),b(0){}; trans(LL a,LL b):a(a),b(b){}; trans operator + (const trans t) const{ return trans(min(a,b+t.a),min(b+t.b,INF)); } LL calc(){return min(a,b);} }seg[N*4]; #define ls x<<1 #define rs x<<1|1 void mdf(LL x,LL l,LL r,LL k,trans tmp){ if (l==r){seg[x]=tmp; return;} LL mid=(l+r)>>1; if (k<=mid) mdf(ls,l,mid,k,tmp); else mdf(rs,mid+1,r,k,tmp); seg[x]=seg[ls]+seg[rs]; } trans qry(LL x,LL l,LL r,LL L,LL R){ if (l>=L && r<=R) return seg[x]; LL mid=(l+r)>>1; if (L<=mid){ if (R>mid) return qry(ls,l,mid,L,R)+qry(rs,mid+1,r,L,R); else return qry(ls,l,mid,L,R); } else return qry(rs,mid+1,r,L,R); } #undef ls #undef rs void dfs1(LL u){ sz[u]=1; for (LL 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(LL u){ if (!top[u]) top[u]=u; LL t=0; dfn[u]=++clk; but[top[u]]=u; for (LL i=head[u],v;i;i=e[i].nxt) if ((v=e[i].v)!=fa[u] && sz[v]>sz[t]) t=v; if (!t){mdf(1,1,n,dfn[u],trans(0,INF)); return;} top[t]=top[u]; dfs2(t); for (LL i=head[u],v;i;i=e[i].nxt) if ((v=e[i].v)!=fa[u] && v!=t) dfs2(v); } void add(LL x,LL y){ trans tmp2=qry(1,1,n,dfn[x],dfn[x]); trans tmp=trans(tmp2.a+y,qry(1,1,n,dfn[x],dfn[x]).b); while (x){ if (fa[top[x]]){ tmp2=qry(1,1,n,dfn[fa[top[x]]],dfn[fa[top[x]]]); tmp2.b-=qry(1,1,n,dfn[top[x]],dfn[but[top[x]]]).calc(); } mdf(1,1,n,dfn[x],tmp); if (fa[top[x]]){ tmp2.b+=qry(1,1,n,dfn[top[x]],dfn[but[top[x]]]).calc(); tmp=tmp2; } x=fa[top[x]]; } } int main(){ scanf("%lld",&n); for (LL i=1;i<=n;i++) scanf("%lld",&c[i]); for (LL i=1;i<n;i++){ scanf("%lld%lld",&x,&y); adde(x,y); adde(y,x); } dfs1(1); dfs2(1); for (LL i=1;i<=n;i++) add(i,c[i]); scanf("%lld",&m); while (m--){ for (ch=getchar();ch!='Q' && ch!='C';ch=getchar()); if (ch=='Q'){ scanf("%lld",&x); printf("%lld\n",qry(1,1,n,dfn[x],dfn[but[top[x]]]).calc()); } if (ch=='C'){ scanf("%lld%lld",&x,&y); add(x,y); } } return 0; }
|