#include<bits/stdc++.h>
#define int long long
using namespace std;
int cnt=1,inf=1e9;
const int maxn=3e4+10;
int fa[maxn],deep[maxn],rk[maxn],id[maxn];
int son[maxn],sz[maxn],tp[maxn],a[maxn];
vector<int>v[maxn];
int sum[maxn<<2],mx[maxn<<2];
void build(int rt,int l,int r)
{
int mid=(l+r)>>1;
if(l==r)
{
mx[rt]=sum[rt]=a[l];
return;
}
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
sum[rt]=sum[rt*2]+sum[rt*2+1];
mx[rt]=max(mx[rt*2],mx[rt*2+1]);
}
int query_sum(int rt,int L,int R,int l,int r)
{
if(L>=l&&R<=r) return sum[rt];
if(L>r||R<l) return 0;
int mid=(L+R)>>1;
return query_sum(rt*2,L,mid,l,r)+query_sum(rt*2+1,mid+1,R,l,r);
}
int query_mx(int rt,int L,int R,int l,int r)
{
if(L>=l&&R<=r) return mx[rt];
if(L>r||R<l) return -inf;
int mid=(L+R)>>1;
return max(query_mx(rt*2,L,mid,l,r),query_mx(rt*2+1,mid+1,R,l,r));
}
void update(int rt,int L,int R,int pos)
{
if(L==R)
{
mx[rt]=sum[rt]=a[pos];
return;
}
int mid=(L+R)>>1;
if(pos>mid) update(rt*2+1,mid+1,R,pos);
else update(rt*2,L,mid,pos);
sum[rt]=sum[rt*2]+sum[rt*2+1];
mx[rt]=max(mx[rt*2],mx[rt*2+1]);
}
void dfs1(int x,int f){
deep[x]=deep[f]+1;
fa[x]=f;
sz[x]=1;
for(int i:v[x]){
if(i==f) continue;
dfs1(i,x);
sz[x]+=sz[i];
if(sz[son[x]]<sz[i]) son[x]=i;
}
}
void dfs2(int x,int t){
tp[x]=t;
rk[x]=cnt;
id[cnt++]=x;
if(son[x]) dfs2(son[x],t);
for(int i:v[x]){
if(i==fa[x]||i==son[x]) continue;
dfs2(i,i);
}
}
int lca(int x,int y){
while(tp[x]!=tp[y])
{
if(deep[tp[x]]>=deep[tp[y]])
x=fa[tp[x]];
else
y=fa[tp[y]];
}
return x<y?x:y;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,q,x,y,z;cin>>n;
string op;
for(int i=1;i<n;i++){
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs1(1,0);
dfs2(1,1);
for(int i=1;i<=n;i++){
cin>>a[rk[i]];
}
build(1,1,n);
cin>>q;
while(q--){
cin>>op>>x>>y;
if(op[1]=='M')
{
z=lca(x,y);
int ans=-inf;
while(true)
{
if(tp[x]==tp[z])
{
ans=max(query_mx(1,1,n,rk[z],rk[x]),ans);
break;
}
ans=max(query_mx(1,1,n,rk[tp[x]],rk[x]),ans);
x=fa[tp[x]];
}
while(true)
{
if(tp[y]==tp[z])
{
ans=max(query_mx(1,1,n,rk[z],rk[y]),ans);
break;
}
ans=max(query_mx(1,1,n,rk[tp[y]],rk[y]),ans);
y=fa[tp[y]];
}
cout<<ans<<endl;
}
else if(op[1]=='S')
{
z=lca(x,y);
int ans=0;
while(true)
{
if(tp[x]==tp[z])
{
ans+=query_sum(1,1,n,rk[z],rk[x]);
break;
}
ans+=query_sum(1,1,n,rk[tp[x]],rk[x]);
x=fa[tp[x]];
}
while(true)
{
if(tp[y]==tp[z])
{
ans+=query_sum(1,1,n,rk[z],rk[y]);
break;
}
ans+=query_sum(1,1,n,rk[tp[y]],rk[y]);
y=fa[tp[y]];
}
ans-=a[rk[z]];
cout<<ans<<endl;
}
else if(op[1]=='H')
{
a[rk[x]]=y;
update(1,1,n,rk[x]);
}
}
return 0;
}