#include<bits/stdc++.h>
using namespace std;
const int N=3e4+100;
int n,cu,cv,idx=1,head[N],w[N],Q;
struct Edge{
int to,next;
}e[N*2];
void add(int u,int v){
e[idx].next=head[u];
e[idx].to=v;
head[u]=idx;
idx++;
}
int fa[N],dep[N],sizet[N],maxs[N];
void dfs1(int now,int f){
fa[now]=f;
dep[now]=dep[f]+1;
sizet[now]=1;
int maxx=-1,maxson=0;
for(int i=head[now];i;i=e[i].next){
if(e[i].to==f) continue;
dfs1(e[i].to,now);
sizet[now]+=sizet[e[i].to];
if(sizet[e[i].to]>maxx){
maxx=sizet[e[i].to],maxson=e[i].to;
}
}
maxs[now]=maxson;
}
int id[N],top[N],cnt,a[N];
void dfs2(int now,int f,int topp){
top[now]=topp;
id[now]=++cnt;
a[id[now]]=w[now];
if(!maxs[now]) return;
dfs2(maxs[now],now,topp);
for(int i=head[now];i;i=e[i].next){
if(e[i].to==f||e[i].to==maxs[now]) continue;
dfs2(e[i].to,now,e[i].to);
}
}
struct Tree{
int sum,ma;
}t[4*N];
void build(int now,int l,int r){
if(l==r){
t[now].sum=a[l];
t[now].ma=a[l];
return;
}
int mid=(l+r)/2;
build(now*2,l,mid);
build(now*2+1,mid+1,r);
t[now].sum=t[now*2].sum+t[now*2+1].sum;
t[now].ma=max(t[now*2].ma,t[now*2+1].ma);
}
void update(int now,int l,int r,int k,int x){
if(l==r&&k==l){
t[now].sum=x;
t[now].ma=x;
return;
}
int mid=(l+r)/2;
if(k<=mid) update(now*2,l,mid,k,x);
if(k>=mid+1) update(now*2+1,mid+1,r,k,x);
t[now].sum=t[now*2].sum+t[now*2+1].sum;
t[now].ma=max(t[now*2].ma,t[now*2+1].ma);
}
int qm(int now,int l,int r,int ml,int mr){
if(ml<=l&&r<=mr) return t[now].ma;
int mid=(l+r)/2,a1,a2;
if(ml<=mid) a1=qm(now*2,l,mid,ml,mr);
if(mr>=mid+1) a2=qm(now*2+1,mid+1,r,ml,mr);
int ans=max(a1,a2);
return ans;
}
int qs(int now,int l,int r,int ml,int mr){
if(ml<=l&&r<=mr) return t[now].sum;
int mid=(l+r)/2,s=0;
if(ml<=mid) s+=qs(now*2,l,mid,ml,mr);
if(mr>=mid+1) s+=qs(now*2+1,mid+1,r,ml,mr);
return s;
}
int querym(int x,int y){
int ans=-30000000;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,qm(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]<dep[y]) swap(x,y);
ans=max(ans,qm(1,1,n,id[y],id[x]));
return ans;
}
int querys(int x,int y){
int sum=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
sum+=qs(1,1,n,id[top[x]],id[x]);
x=fa[top[x]];
}
if(dep[x]<dep[y]) swap(x,y);
sum+=qs(1,1,n,id[top[x]],id[x]);
return sum;
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
scanf("%d%d",&cu,&cv);
add(cu,cv);
add(cv,cu);
}
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
dfs1(1,0);
dfs2(1,0,1);
build(1,1,n);
cin>>Q;
string opt;
int X,Y;
while(Q--){
cin>>opt;
if(opt=="CHANGE"){
scanf("%d%d",&X,&Y);
update(1,1,n,id[X],Y);
}
if(opt=="QMAX"){
scanf("%d%d",&X,&Y);
printf("%d\n",querym(X,Y));
}
if(opt=="QSUM"){
scanf("%d%d",&X,&Y);
printf("%d\n",querys(X,Y));
}
}
return 0;
}