#include<bits/stdc++.h>
#define int long long
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
const int N=3e4+100;
int n,a[N],w[N];
int tot,head[N];
struct node{
int to,nxt;
};
node E[N<<1];
void addedge(int u,int v){
tot++;
E[tot].nxt=head[u];
E[tot].to=v;
head[u]=tot;
}
//线段树
int tr1[N<<2],tr2[N<<2];
void pushup(int p){
tr1[p]=tr1[ls(p)]+tr1[rs(p)];
tr2[p]=max(tr2[ls(p)],tr2[rs(p)]);
}
void build(int p,int l,int r){
if(l==r){
tr1[p]=w[l];
tr2[p]=w[l];
return;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
void update(int p,int l,int r,int x,int k){
if(l==r){
tr1[p]=k;
tr2[p]=k;
return;
}
int mid=(l+r)>>1;
if(x<=mid) update(ls(p),l,mid,x,k);
if(x>mid) update(rs(p),mid+1,r,x,k);
pushup(p);
}
int ask1(int p,int l,int r,int L,int R){
if(L<=l&&r<=R){
return tr1[p];
}
int mid=(l+r)>>1,res=0;
if(L<=mid) res+=ask1(ls(p),l,mid,L,R);
if(R>mid) res+=ask1(rs(p),mid+1,r,L,R);
return res;
}
int ask2(int p,int l,int r,int L,int R){
if(L<=l&&r<=R){
return tr2[p];
}
int mid=(l+r)>>1,res=-1e9;
if(L<=mid) res=max(ask2(ls(p),l,mid,L,R),res);
if(R>mid) res=max(ask2(rs(p),mid+1,r,L,R),res);
return res;
}
//树链
int cnt,son[N],size[N],dfn[N],fa[N],top[N],dep[N];
int dfs1(int u,int f){
size[u]++;
fa[u]=f;
dep[u]=dep[f]+1;
int maxn=0,sum;
for(int i=head[u];i;i=E[i].nxt){
int v=E[i].to;
sum=0;
if(fa[u]!=v) sum=dfs1(v,u);
size[u]+=sum;
if(sum>maxn){
son[u]=v;
maxn=sum;
}
}
return size[u];
}
void dfs2(int u,int f,int tp){
dfn[u]=++cnt;
top[u]=tp;
if(!son[u]) return;
dfs2(son[u],u,tp);
for(int i=head[u];i;i=E[i].nxt){
int v=E[i].to;
if(v!=f&&v!=son[u]) dfs2(v,u,v);
}
}
int m;
void change(int x,int k){
update(1,1,n,dfn[x],k);
}
int qmax(int x,int y){
int ans=-1e9;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,ask2(1,1,n,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans=max(ans,ask2(1,1,n,dfn[x],dfn[y]));
return ans;
}
int qsum(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=ask1(1,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=ask1(1,1,n,dfn[x],dfn[y]);
return ans;
}
signed main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
addedge(x,y);
addedge(y,x);
}
for(int i=1;i<=n;i++) cin>>w[i];
dfs1(1,0);
dfs2(1,0,1);
build(1,1,n);
cin>>m;
for(int i=1;i<=m;i++){
string op;cin>>op;int x,y;
if(op=="CHANGE"){
cin>>x>>y;
change(x,y);
}
if(op=="QMAX"){
cin>>x>>y;
cout<<qmax(x,y)<<endl;
}
if(op=="QSUM"){
cin>>x>>y;
cout<<qsum(x,y)<<endl;
}
}
return 0;
}