#include <bits/stdc++.h>
#define maxn 200005
#define int long long
using namespace std;
int a[maxn],head[maxn],tot,cnt,son[maxn],n,w[maxn],b[maxn];
int dep[maxn],fa[maxn],size[maxn],lazy[maxn],top[maxn],id[maxn];
struct Edge{
int to,nex;
}e[maxn];
void add(int x,int y){
e[++tot].to=y;
e[tot].nex=head[x];
head[x]=tot;
}
void dfs1(int x,int fath,int depth){
dep[x]=depth; fa[x]=fath; size[x]=1;
int maxson=-1;
for(int i=head[x];i;i=e[i].nex){
int to=e[i].to;
if(to==fath) continue;
dfs1(to,x,depth+1);
size[x]+=size[to];
if(size[to]>maxson) maxson=size[to],son[x]=to;
}
}
void dfs2(int x,int topx){
top[x]=topx; id[x]=++cnt; w[cnt]=a[x];
if(son[x]==0) return;
dfs2(son[x],topx);
for(int i=head[x];i;i=e[i].nex){
int to=e[i].to;
if(to==son[x]||to==fa[x]) continue;
dfs2(to,to);
}
}
void build(int l,int r,int rt){
if(l==r){
a[rt]=w[l]; b[rt]=a[rt];
return;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
a[rt]=a[rt<<1]+a[rt<<1|1];
b[rt]=max(b[rt<<1],b[rt<<1|1]);
}
inline void updata(int x,int C,int l,int r,int rt){
if(l==r){
a[rt]=C; b[rt]=C;
return;
}
int m=(l+r)>>1;
if(x<=m) updata(x,C,l,m,rt<<1);
if(x>m) updata(x,C,m+1,r,rt<<1|1);
a[rt]=a[rt<<1]+a[rt<<1|1];
b[rt]=max(b[rt<<1],b[rt<<1|1]);
}
inline int query_sum(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R) return a[rt];
int m=(l+r)>>1;
int ans=0;
if(L<=m) ans+=query_sum(L,R,l,m,rt<<1);
if(R>m) ans+=query_sum(L,R,m+1,r,rt<<1|1);
return ans;
}
inline int query_max(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R) return b[rt];
int m=(l+r)>>1;
int ans=-0x3f3f3f3f;
if(L<=m) ans=max(ans,query_max(L,R,l,m,rt<<1));
if(R>m) ans=max(ans,query_max(L,R,m+1,r,rt<<1|1));
return ans;
}
int qRange_sum(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=query_sum(id[top[x]],id[x],1,n,1);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=query_sum(id[x],id[y],1,n,1);
return ans;
}
int qRange_max(int x,int y){
int ans=-0x3f3f3f3f;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,query_max(id[top[x]],id[x],1,n,1));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans=max(ans,query_max(id[x],id[y],1,n,1));
return ans;
}
signed main(){
ios::sync_with_stdio(false); cin.tie(0);
int q,x,y,C;
while(cin>>n){
memset(head,0,sizeof(head)); tot=0;
memset(son,0,sizeof(son)); cnt=0;
for(int i=1;i<n;i++){
cin>>x>>y;
add(x,y); add(y,x);
}
for(int i=1;i<=n;i++) cin>>a[i];
dfs1(1,0,1); dfs2(1,1); build(1,n,1);
cin>>q;
while(q--){
string op;
cin>>op;
if(op=="CHANGE"){
cin>>x>>C;
updata(x,C,1,n,1);
}
if(op=="QMAX"){
cin>>x>>y;
cout<<qRange_max(x,y)<<endl;
}
if(op=="QSUM"){
cin>>x>>y;
cout<<qRange_sum(x,y)<<endl;
}
}
}
return 0;
}