#include<bits/stdc++.h>
#define int long long
using namespace std;
struct bian
{
int nxt,to;
}b[60001];
int dian[30001],tot;
int sum[30001],maxv[30001],rnk[30001],fa[30001],hson[30001],sze[30001],dep[30001],dfn[30001],top[30001];
int n,p,cnt,zhi[30001];
inline void add(int x,int y)
{
b[++tot].nxt=dian[x];
b[tot].to=y;
dian[x]=tot;
}
void dfs1(int x)
{
hson[x]=-1;
dep[x]=dep[fa[x]]+1;
sze[x]=1;
for(int i=dian[x];i;i=b[i].nxt)
{
int c=b[i].to;
if(c==fa[x]||dep[c]!=0)continue;
fa[c]=x;
dfs1(c);
sze[x]+=sze[c];
if(hson[x]==-1||sze[hson[x]]<sze[c])hson[x]=c;
}
}
void dfs2(int x,int t)
{
top[x]=t;
dfn[x]=++cnt;
rnk[cnt]=x;
if(hson[x]==-1)return ;
dfs2(hson[x],t);
for(int i=dian[x];i;i=b[i].nxt)
{
int c=b[i].to;
if(c==hson[x]||c==fa[x])continue;
dfs2(c,c);
}
}
void build(int k,int l,int r)
{
if(l==r)
{
maxv[k]=sum[k]=zhi[rnk[l]];
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build((k<<1)|1,mid+1,r);
sum[k]=sum[k<<1]+sum[(k<<1)|1];
maxv[k]=max(maxv[k<<1],maxv[(k<<1)|1]);
}
void add(int k,int l,int r,int x,int y)
{
if(l>x||r<x)return ;
if(l==r&&l==x)
{
maxv[k]=sum[k]=y;
return ;
}
int mid=(l+r)>>1;
add(k<<1,l,mid,x,y);
add((k<<1)|1,mid+1,r,x,y);
sum[k]=sum[k<<1]+sum[(k<<1)|1];
maxv[k]=max(maxv[k<<1],maxv[(k<<1)|1]);
}
int query1(int k,int l,int r,int x,int y)
{
if(l>y||r<x)return 0;
if(l>=x&&r<=y)return sum[k];
int mid=(l+r)>>1;
int all=0;
all+=query1(k<<1,l,mid,x,y);
all+=query1((k<<1)|1,mid+1,r,x,y);
return all;
}
int query2(int k,int l,int r,int x,int y)
{
if(l>y||r<x)return 0;
if(l>=x&&r<=y)return maxv[k];
int mid=(l+r)>>1;
int all=-50001;
all=query2(k<<1,l,mid,x,y);
all=max(all,query2((k<<1)|1,mid+1,r,x,y));
return all;
}
int query_max(int x,int y)
{
int fx=top[x],fy=top[y];
int all=-50000;
while(fx!=fy)
{
if(dep[x]>dep[y])
{
all=max(all,query2(1,1,cnt,dfn[fx],dfn[x]));
x=fa[fx];
}
else
{
all=max(all,query2(1,1,cnt,dfn[fy],dfn[y]));
y=fa[fy];
}
fx=top[x];
fy=top[y];
}
if(dfn[x]>dfn[y]){
all=max(all,query2(1,1,cnt,dfn[y],dfn[x]));
}
else all=max(all,query2(1,1,cnt,dfn[x],dfn[y]));
return all;
}
int query_sum(int x,int y)
{
int fx=top[x],fy=top[y];
int all=0;
while(fx!=fy)
{
if(dep[fx]>dep[fy])
{
all+=query1(1,1,cnt,dfn[fx],dfn[x]);
x=fa[fx];
}
else
{
all+=query1(1,1,cnt,dfn[fy],dfn[y]);
y=fa[fy];
}
fx=top[x];
fy=top[y];
}
if(dfn[x]>dfn[y]){
all+=query1(1,1,cnt,dfn[y],dfn[x]);
}
else all+=query1(1,1,cnt,dfn[x],dfn[y]);
return all;
}
signed main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int x,y;
scanf("%lld%lld",&x,&y);
add(x,y);
add(y,x);
}
dep[0]=-1;
dfs1(2);
dfs2(2,2);
for(int i=1;i<=n;i++)scanf("%lld",&zhi[i]);
build(1,1,cnt);
cin>>p;
for(int i=1;i<=p;i++)
{
string s;
int x,y;
cin>>s;
scanf("%lld%lld",&x,&y);
if(s=="QMAX")printf("%d\n",query_max(x,y));
else if(s=="CHANGE") add(1,1,cnt,dfn[x],y);
else printf("%d\n",query_sum(x,y));
}
return 0;
}