void setup(void) { mkroot(); ent * sch = mksched(); assert(SUCCESS == LINK_R(root(), sch, "proc")); ent* mm = mkmm(); assert(SUCCESS == LINK_R(root(), mm, "mm")); }
int main() { freopen("1036.in","r",stdin); freopen("1036.out","w",stdout); int n,m;dmax[0]=-INF; scanf("%d",&n); for(int i=1,p1,p2;i<=n-1;i++) { scanf("%d%d",&p1,&p2); addEdge(p1,p2); addEdge(p2,p1); } setTree(1); for(int i=1;i<=n;i++) scanf("%d",&val[i]); for(int i=1;i<=n;i++) access(i); scanf("%d",&m); char odr[11]; for(int i=1,p1,p2;i<=m;i++) { scanf("%s%d%d",odr,&p1,&p2); if(odr[1]=='H') val[p1]=p2; else if(odr[1]=='M') { mkroot(p1); access(p2); splay(p2); printf("%d\n",Max(dmax[son[p2][0]],val[p2])); } else { mkroot(p1); access(p2); splay(p2); printf("%d\n",sum[son[p2][0]]+val[p2]); } } }
void link(int p,int pt) { mkroot(p); fa[p]=pt; // access(p); }