#include<cstdio>
#include<algorithm>
#define N 1919810
#define lc p<<1
#define rc p<<1|1
using namespace std;
int n,q,head[N],to[N],nxt[N],a[N],w[N],tot,idx,id[N],top[N],siz[N],son[N],dep[N],f[N];
void add(int u,int v){
to[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
struct Segement_tree{
int l,r,val,mx;
}s[N*4];
void pushup(int p){
s[p].val=s[lc].val+s[rc].val;
s[p].mx=max(s[lc].mx,s[rc].mx);
}
void build(int p,int l,int r){
s[p].l=l,s[p].r=r;
if(l==r){
s[p].val=s[p].mx=a[l];
return;
}
build(lc,l,(l+r)/2);
build(rc,(l+r)/2+1,r);
pushup(p);
}
void change(int p,int x,int v){
if(s[p].l>x||s[p].r<x)return;
if(s[p].l==x&&s[p].r==x){
s[p].val=s[p].mx=v;
return;
}
change(lc,x,v);change(rc,x,v);
pushup(p);
}
int qmax(int p,int l,int r){
if(s[p].l>r||s[p].r<l)return -2147483647;
if(s[p].l>=l&&s[p].r<=r)return s[p].mx;
return max(qmax(lc,l,r),qmax(rc,l,r));
}
int qsum(int p,int l,int r){
if(s[p].l>r||s[p].r<l)return 0;
if(s[p].l>=l&&s[p].r<=r)return s[p].val;
return qsum(lc,l,r)+qsum(rc,l,r);
}
void dfs1(int x,int fa){
dep[x]=dep[fa]+1;f[x]=fa;siz[x]=1;
int maxn=-1;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y==fa)continue;
dfs1(y,x);
siz[x]+=siz[y];
if(maxn<siz[y])son[x]=y,maxn=siz[y];
}
}
void dfs2(int x,int topx){
id[x]=++idx;top[x]=topx;a[id[x]]=w[x];
if(!son[x])return;
dfs2(son[x],topx);
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y==f[x]||y==son[x])continue;
dfs2(y,y);
}
}
int querymax(int x,int y){
int res=-2147483647;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
res=max(res,qmax(1,id[top[x]],id[x]));
x=f[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
return max(res,qmax(1,id[x],id[y]));
}
int querysum(int x,int y){
int res=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
res+=qsum(1,id[top[x]],id[x]);
x=f[top[x]];
}
if(dep[x]>=dep[y])swap(x,y);
return res+qsum(1,id[x],id[y]);
}
signed main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
dfs1(1,0);dfs2(1,1);
build(1,1,n);
scanf("%d",&q);
while(q--){
char s[10];
int a,b;
scanf("%s%d%d",s,&a,&b);
if(s[0]=='C'){
change(1,id[a],b);
}else if(s[0]=='Q'){
if(s[1]=='M'){
printf("%d\n",querymax(a,b));
}else{
printf("%d\n",querysum(a,b));
}
}
}
return 0;
}
我的DFS1里没有更新siz的值,但是获得了80分的好成绩