#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
using namespace std;
const int N=3e4+5;
int n,m;
vector<int> e[N];
int tot[N],fa[N],dep[N],son[N],top[N],idx[N];
int a[N],b[N];
void dfs1(int now,int f,int deep)
{
dep[now]=deep;
fa[now]=f;
tot[now]=1;
for(auto v:e[now])
{
if(v==f) continue;
else
{
dfs1(v,now,deep+1);
tot[now]+=tot[v];
if(tot[v]>tot[son[now]])
{
son[now]=v;
}
}
}
return ;
}
int pre[N],cnt;
void dfs2(int u,int TP)
{
idx[u]=++cnt;
pre[cnt]=u;
top[u]=TP;
if(son[u])
{
dfs2(son[u],TP);
}
for(auto v:e[u])
{
if(v==fa[u]||v==son[u]) continue;
if(!idx[v])
{
dfs2(v,v);
}
}
return ;
}
int q;
string str;
struct peo{
int l,r,maxn,vals;
}t[N<<2];
#define lson k<<1
#define rson k<<1|1
void update(int k)
{
t[k].maxn=max(t[lson].maxn,t[rson].maxn);
t[k].vals=t[lson].vals+t[rson].vals;
return ;
}
void build(int k,int l,int r)
{
t[k].l=l,t[k].r=r;
if(l==r)
{
// t[k].maxn=a[l];
// t[k].vals=a[l];
t[k].maxn=b[pre[l]];
t[k].vals=b[pre[l]];
return ;
}
int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
update(k);
}
void change(int k,int l,int r,int val)
{
if(t[k].l==l&&t[k].r==r)
{
t[k].maxn=val;
t[k].vals=val;
return ;
}
int mid=(t[k].l+t[k].r)>>1;
if(l<=mid)
{
change(lson,l,r,val);
}
if(r>mid)
{
change(rson,l,r,val);
}
update(k);
return ;
}
int qrmax(int k,int l,int r)
{
int ans=-1;
if(t[k].l>=l&&t[k].r<=r)
{
return t[k].maxn;
}
int mid=(t[k].l+t[k].r)>>1;
if(l<=mid)
{
ans=max(ans,qrmax(lson,l,r));
}
if(r>mid)
{
ans=max(ans,qrmax(rson,l,r));
}
update(k);
return ans;
}
int qrsum(int k,int l,int r)
{
int ans=0;
if(t[k].l>=l&&t[k].r<=r)
{
return t[k].vals;
}
int mid=(t[k].l+t[k].r)>>1;
if(l<=mid)
{
ans+=qrsum(lson,l,r);
}
if(r>mid)
{
ans+=qrsum(rson,l,r);
}
update(k);
return ans;
}
int Qmax(int u,int v)
{
int ans=-0x7ffffff;
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans=max(ans,qrmax(1,idx[top[u]],idx[u]));
u=fa[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
ans=max(ans,qrmax(1,idx[v],idx[u]));
return ans;
}
int Qsum(int u,int v)
{
int ans=0;
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans+=qrsum(1,idx[top[u]],idx[u]);
u=fa[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
ans+=qrsum(1,idx[v],idx[u]);
return ans;
}
int main()
{
// freopen("2590.cpp","r=",stdin);
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
fa[1]=1;
dep[1]=1;
dfs1(1,0,1);
dfs2(1,1);
build(1,1,n);
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
cin>>str;
if(str=="QMAX")
{
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",Qmax(u,v));
continue;
}
if(str=="QSUM")
{
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",Qsum(u,v));
continue;
}
if(str=="CHANGE")
{
int u,v;
scanf("%d%d",&u,&v);
change(1,u,u,v);
continue;
}
}
return 0;
}