#include<cstdio>
#include<algorithm>
#include<climits>
#include<iostream>
#include<cstring>
using namespace std;
const int N=30010;
int n,m,tot,head[N],nxt[N*2],to[N*2],val[N],pre[N],dep[N],q[N],size[N],son[N],top[N],w[N],id[N];
int MAX[N<<2],sum[N<<2];
bool v[N];
char s[10];
#define lc idx<<1
#define rc idx<<1|1
void pushup(int idx)
{
MAX[idx]=max(MAX[lc],MAX[rc]);
sum[idx]=sum[lc]+sum[rc];
}
void build(int idx,int l,int r)
{
if(l==r)
{
MAX[idx]=sum[idx]=w[l];
return ;
}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(idx);
}
void update(int idx,int l,int r,int u,int val)
{
if(l==r)
{
MAX[idx]=sum[idx]=val;
return ;
}
int mid=(l+r)>>1;
if(u<=mid)update(lc,l,mid,u,val);
else update(rc,mid+1,r,u,val);
pushup(idx);
}
inline void add(int u,int v)
{
to[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
int qmax(int idx,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r) return MAX[idx];
int mid=(l+r)>>1;
int t1=-30000,t2=-30000;
if(ql<=mid)t1=qmax(lc,l,mid,ql,qr);
if(qr>mid)t2=qmax(rc,mid+1,r,ql,qr);
return max(t1,t2);
}
int qsum(int idx,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r) return sum[idx];
int mid=(l+r)>>1;
int t1=0,t2=0;
if(ql<=mid)t1=qsum(lc,l,mid,ql,qr);
if(qr>mid)t2=qsum(rc,mid+1,r,ql,qr);
return t1+t2;
}
inline int gmax(int a,int b)
{
int tmp=-30000;
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
tmp=max(tmp,qmax(1,1,n,id[top[a]],id[a]));
a=pre[top[a]];
}
if(id[a]>id[b])swap(a,b);
tmp=max(tmp,qmax(1,1,n,id[a],id[b]));
return tmp;
}
inline int gsum(int a,int b)
{
int tmp=0;
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
tmp+=qsum(1,1,n,id[top[a]],id[a]);
a=pre[top[a]];
}
if(id[a]>id[b])swap(a,b);
tmp+=qsum(1,1,n,id[a],id[b]);
return tmp;
}
int main()
{
scanf("%d",&n);
int x,y;
memset(head,0,sizeof(head));
memset(v,0,sizeof(v));
memset(son,0,sizeof(son));
memset(top,0,sizeof(top));
memset(size,0,sizeof(size));
tot=0;
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++) scanf("%d",&val[i]);
v[dep[1]=q[0]=1]=true;
int r=0;
for(int l=0;l<=r;l++)
{
for(int k=head[q[l]];k;k=nxt[k])
{
if(!v[to[k]])
{
v[to[k]]=1;
dep[q[++r]=to[k]]=dep[q[l]]+1;
pre[q[r]]=q[l];
son[q[l]]=q[r];
}
}
}
for(int i=r;i>=0;i--)
{
size[pre[q[i]]]+=++size[q[i]];
if(size[q[i]]>size[son[pre[q[i]]]])
son[pre[q[i]]]=q[i];
}
tot=0;
for(int i=0;i<=r;i++)
{
if(!top[q[i]])
for(int k=q[i];k;k=son[k])
{
top[k]=q[i];
w[id[k]=++tot]=val[k];
}
}
build(1,1,n);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%s%d%d",s,&x,&y);
if(s[0]=='C') update(1,1,n,id[x],y);
else if(s[1]=='M') printf("%d\n",gmax(x,y));
else printf("%d\n",gsum(x,y));
}
}