板题。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define maxn 30005
#define inf 0x3fffffff
using namespace std;
int dep[maxn],top[maxn],fa[maxn],son[maxn],size[maxn],id[maxn],num,tot,a[maxn],head[maxn];
struct ppi{
int to;
int next;
}pp1[maxn<<1];
void add(int u,int v){
pp1[tot].to=v;
pp1[tot].next=head[u];
head[u]=tot++;
pp1[tot].to=u;
pp1[tot].next=head[v];
head[v]=tot++;
}
struct pi{
int le;
int ri,max,sum;
}pp[maxn<<2];
void build(int tot,int l,int r){
pp[tot].max=-inf;
pp[tot].le=l;
pp[tot].ri=r;
pp[tot].sum=0;
if(l==r) return ;
build(tot<<1,l,(l+r)/2);
build(2*tot+1,(l+r)/2+1,r);
}
void dfs1(int u,int pa,int d){
dep[u]=d;
size[u]=1;
son[u]=0;
fa[u]=pa;
int k=head[u],v;
while(k!=-1){
v=pp1[k].to;
if(v!=pa){
dfs1(v,u,d+1);
size[u]+=size[v];
if(size[son[u]]<size[v]) son[u]=v;
}
k=pp1[k].next;
}
}
void dfs2(int u,int pa,int tp){
top[u]=tp;
id[u]=++num;
if(son[u]) dfs2(son[u],u,tp);
int k,v;
k=head[u];
while(k!=-1){
v=pp1[k].to;
if(v!=pa&&v!=son[u]){
dfs2(v,u,v);
}
k=pp1[k].next;
}
}
void push(int tot){
pp[tot].max=max(pp[2*tot].max,pp[2*tot+1].max);
pp[tot].sum=pp[2*tot].sum+pp[2*tot+1].sum;
}
void merg(int tot,int x,int p){
if(pp[tot].le==pp[tot].ri){
pp[tot].max=p;
pp[tot].sum=p;
return ;
}
int mid=(pp[tot].le+pp[tot].ri)/2;
if(x<=mid) merg(2*tot,x,p);
else merg(2*tot+1,x,p);
push(tot);
}
int query1(int tot,int l,int r){
if(pp[tot].le>=l&&pp[tot].ri<=r) return pp[tot].max;
int mid,s;
mid=(pp[tot].le+pp[tot].ri)/2;
s=-inf;
if(l<=mid) s=max(s,query1(2*tot,l,r));
if(r>mid) s=max(s,query1(2*tot+1,l,r));
return s;
}
int query2(int tot,int l,int r){
if(pp[tot].le>=l&&pp[tot].ri<=r) return pp[tot].sum;
int s=0;
int mid=(pp[tot].le+pp[tot].ri)/2;
if(l<=mid) s+=query2(2*tot,l,r);
if(r>mid) s+=query2(2*tot+1,l,r);
return s;
}
int get1(int u,int v)
{
int to1,to2,s;
s=-inf;
to1=top[u];
to2=top[v];
while(to1!=to2){
if(dep[to1]<dep[to2]){
swap(to1,to2);
swap(u,v);
}
s=max(s,query1(1,id[to1],id[u]));
u=fa[to1];
to1=top[u];
}
if(dep[u]>dep[v]) swap(u,v);
s=max(s,query1(1,id[u],id[v]));
return s;
}
int get2(int u,int v){
int to1,to2,s=0;
to1=top[u];
to2=top[v];
while(to1!=to2){
if(dep[to1]<dep[to2]){
swap(to1,to2);
swap(u,v);
}
s+=query2(1,id[to1],id[u]);
u=fa[to1];
to1=top[u];
}
if(dep[u]>dep[v]) swap(u,v);
s+=query2(1,id[u],id[v]);
return s;
}
char c[20];
int main()
{
int i,n,m,p;
cin>>n;
tot=0;
num=0;
memset(head,-1,sizeof(head));
for(i=1;i<n;i++) {
scanf("%d%d",&m,&p);
add(m,p);
}
dfs1(1,1,1);
dfs2(1,1,1);
build(1,1,n);
for(i=1;i<=n;i++){
scanf("%d",&p);
merg(1,id[i],p);
}
scanf("%d",&m);
for(i=0;i<m;i++){
int k;
scanf("%s",c);
if(c[0]=='C'){
scanf("%d%d",&p,&k);
merg(1,id[p],k);
}
else{
scanf("%d%d",&p,&k);
if(c[1]=='M'){
printf("%d\n",get1(p,k));
}
else printf("%d\n",get2(p,k));
}
}
}