rt
#include <bits/stdc++.h>
using namespace std;
#define lson x<<1
#define rson x<<1|1
struct Tree{
int sum,maxx;
}tree[120010];
int siz[30010],fat[30010],dep[30010],son[30010],w[30010],top[30010],dfn[30010],tim;
int n,a[30010],Q,x,y;
vector<int> ed[30010];
char s[10];
void dfs1(int x){
int len=ed[x].size(),heavy_son=-1;
dep[x]=dep[fat[x]]+1;
siz[x]=1;
for(int i=0;i<len;i++){
int v=ed[x][i];
if(v==fat[x]) continue;
fat[v]=x;
dfs1(v);
if(siz[v]>heavy_son){
heavy_son=siz[v];
son[x]=v;
}
}
}
void dfs2(int x,int t){
int len=ed[x].size();
top[x]=t;
dfn[x]=++tim;
w[tim]=a[x];
if(!son[x]) return;
dfs2(son[x],t);
for(int i=0;i<len;i++){
int v=ed[x][i];
if(v==fat[x]||v==son[x]) continue;
dfs2(v,v);
}
}
void build_tree(int x,int l,int r){
if(l==r){
tree[x].sum=tree[x].maxx=w[l];
return;
}
int mid=(l+r)>>1;
build_tree(lson,l,mid);
build_tree(rson,mid+1,r);
tree[x].sum=tree[lson].sum+tree[rson].sum;
tree[x].maxx=max(tree[lson].maxx,tree[rson].maxx);
}
void update(int x,int l,int r,int d,int v){
if(l==r){
tree[x].sum=tree[x].maxx=v;
return;
}
int mid=(l+r)>>1;
if(mid>=d) update(lson,l,mid,d,v);
else update(rson,mid+1,r,d,v);
tree[x].sum=tree[lson].sum+tree[rson].sum;
tree[x].maxx=max(tree[lson].maxx,tree[rson].maxx);
}
Tree query(int x,int l,int r,int cl,int cr){
if(cl<=l&&r<=cr) return tree[x];
int mid=(l+r)>>1;
Tree res={-1,-1};
if(mid>=cl) res=query(lson,l,mid,cl,cr);
if(mid<cr){
if(res.sum==-1) res=query(rson,mid+1,r,cl,cr);
else{
Tree ces=query(rson,mid+1,r,cl,cr);
res.sum+=ces.sum;
res.maxx=max(res.maxx,ces.maxx);
}
}
return res;
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
ed[x].push_back(y);
ed[y].push_back(x);
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
dfs1(1);
dfs2(1,1);
build_tree(1,1,n);
scanf("%d",&Q);
while(Q--){
scanf("%s%d%d",s+1,&x,&y);
if(s[1]=='C') update(1,1,n,dfn[x],y);
else if(s[2]=='S'){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
Tree c=query(1,1,n,dfn[top[x]],dfn[x]);
ans+=c.sum;
x=fat[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
Tree c=query(1,1,n,dfn[x],dfn[y]);
ans+=c.sum;
printf("%d\n",ans);
}else{
int ans=-1e9;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
Tree c=query(1,1,n,dfn[top[x]],dfn[x]);
ans=max(ans,c.maxx);
x=fat[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
Tree c=query(1,1,n,dfn[x],dfn[y]);
ans=max(ans,c.maxx);
printf("%d\n",ans);
}
}
return 0;
}