#include<bits/stdc++.h>
using namespace std;
const int maxn=31000;
int n,m,summ,maxx;
int seg[maxn],rev[maxn<<2],siz[maxn],son[maxn],top[maxn],dep[maxn];
int sum[maxn<<2],num[maxn],fa[maxn],Max[maxn<<2];
int first[maxn],nxt[maxn],go[maxn],tot;
void query(int k,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
summ+=sum[k];
maxx=max(maxx,Max[k]);
return;
}
int mid=(l+r)>>1,res=0;
if(mid>=R) query(k<<1,l,mid,L,R);
else if(L>=mid+1) query(k<<1|1,mid+1,r,L,R);
else query(k<<1,l,mid,L,R),query(k<<1|1,mid+1,r,L,R);
}
void change(int k,int l,int r,int val,int pos)
{
if(pos>r||pos<l) return ;
if(l==r)
{
sum[k]=val;
Max[k]=val;
return;
}
int mid=(l+r)>>1;
if(mid>=pos) change(k<<1,l,mid,val,pos);
if(mid+1<=pos) change((k<<1)+1,mid+1,r,val,pos);
sum[k]=sum[k<<1]+sum[(k<<1)+1];
Max[k]=max(Max[k<<1],Max[(k<<1)+1]);
}
void dfs1(int u,int fat)
{
siz[u]=1;
fa[u]=fat;
dep[u]=dep[fat]+1;
for(int e=first[u];e;e=nxt[e])
{
int v=go[e];
if(v!=fat)
{
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]])
{
son[u]=v;
}
}
}
return;
}
void dfs2(int u,int fat)
{
if(son[u])
{
seg[son[u]]=++tot;
top[son[u]]=top[u];
rev[tot]=son[u];
dfs2(son[u],u);
}
for(int e=first[u];e;e=nxt[e])
{
int v=go[e];
if(!top[v])
{
seg[v]=++tot;
rev[tot]=v;
top[v]=v;
dfs2(v,u);
}
}
}
void build(int k,int l,int r)
{
if(l==r)
{
Max[k]=sum[k]=num[rev[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];
Max[k]=max(Max[k<<1],Max[(k<<1)+1]);
}
int cnt;
inline void add(int x,int y)
{
nxt[++cnt]=first[x];
first[x]=cnt;
go[cnt]=y;
}
inline int read()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') {f=-1;c=getchar();}
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
void ask(int x,int y)
{
summ=0; maxx=-10000000;
int fx=top[x],fy=top[y];
while(fx!=fy)
{
if(dep[fx]<dep[fy]) swap(x,y),swap(fx,fy);
query(1,1,tot,seg[fx],seg[x]);
x=fa[fx]; fx=top[x];
}
if(dep[x]>dep[y]) swap(x,y);
query(1,1,tot,seg[x],seg[y]);
}
int main()
{
n=read();
for(int i=1;i<n;++i)
{
int x=read(),y=read();
add(x,y);
add(y,x);
}
for(int i=1;i<=n;++i)
{
num[i]=read();
}
tot=seg[1]=top[1]=rev[1]=1;
dfs1(1,0);
dfs2(1,0);
build(1,1,tot);
m=read();
char sr[10];
while(m--)
{
scanf("%s",sr);
int u=read(),v=read();
if(sr[1]=='H')
{
change(1,1,tot,v,seg[u]);
}
else
{
ask(u,v);
if(sr[1]=='M') printf("%d\n",maxx);
else printf("%d\n",summ);
}
}
return 0;
}