#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
long long n,m,r,p;
long long a[N],f[N],sz[N],d[N],hson[N],dfn[N],top[N],tot=0,b[N];
long long tree[N<<2]={},tree1[N<<2]={};
vector <int> adj[N];
void build(int x,int l,int r){
if(l==r){
tree[x]=b[l];
tree1[x]=b[l];
}
else{
long long m=(l+r)>>1;
build(x+x,l,m);
build(x+x+1,m+1,r);
tree[x]=(tree[x+x]+tree[x+x+1]);
tree1[x]=max(tree1[x+x],tree1[x+x+1]);
}
}
void modify(int x,long l,int r,int le,int c){
if(l==r){
tree[x]=c;
tree1[x]=c;
}
else{
int m=(l+r)>>1;
if(le<=m) modify(x+x,l,m,le,c);
else if(le>m) modify(x+x+1,m+1,r,le,c);
tree[x]=tree[x+x]+tree[x+x+1];
tree1[x]=max(tree1[x+x],tree1[x+x+1]);
}
return;
}
long long query(int x,int l,int r,int le,int ri){
if(le>ri) swap(le,ri);
if(l==r){
return tree[x];
}
else{
long long m=(l+r)/2;
if(ri<=m) return query(x+x,l,m,le,ri);
else if(le>m) return query(x+x+1,m+1,r,le,ri);
else return (query(x+x,l,m,le,m)+query(x+x+1,m+1,r,m+1,ri));
}
}
long long query1(int x,int l,int r,int le,int ri){
if(le>ri) swap(le,ri);
if(l==r){
return tree1[x];
}
else{
long long m=(l+r)/2;
if(ri<=m) return query1(x+x,l,m,le,ri);
else if(le>m) return query1(x+x+1,m+1,r,le,ri);
else return max(query1(x+x,l,m,le,m),query1(x+x+1,m+1,r,m+1,ri));
}
}
long long LCA1(int x,int y){
long long tot=-5e4;
while(top[x]!=top[y]){
if(d[top[x]]>=d[top[y]]){
tot=max(tot,query1(1,1,n,dfn[top[x]],dfn[x]));
x=f[top[x]];
}
else{
tot=max(tot,query1(1,1,n,dfn[top[x]],dfn[x]));
y=f[top[y]];
}
}
if(dfn[x]>dfn[y]) swap(x,y);
tot=max(tot,query1(1,1,n,dfn[x],dfn[y]));
return tot;
}
long long LCA(int x,int y){
long long tot=0;
while(top[x]!=top[y]){
if(d[top[x]]>=d[top[y]]){
tot+=query(1,1,n,dfn[top[x]],dfn[x]);
x=f[top[x]];
}
else{
tot+=query(1,1,n,dfn[top[y]],dfn[y]);
y=f[top[y]];
}
}
if(dfn[x]>dfn[y]) swap(x,y);
tot+=query(1,1,n,dfn[x],dfn[y]);
return tot;
}
void dfs(int u,int fa){
sz[u]=1;
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
if(v!=fa){
d[v]=d[u]+1;
f[v]=u;
dfs(v,u);
sz[u]+=sz[v];
if(sz[hson[u]]<sz[v]) hson[u]=v;
}
}
return;
}
void dfs1(int u,int t){
tot++;
dfn[u]=tot;
top[u]=t;
b[tot]=a[u];
if(!hson[u]){
return;
}
dfs1(hson[u],t);
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
if(v!=f[u]&&v!=hson[u]){
dfs1(v,v);
}
}
return;
}
int main(){
scanf("%lld",&n);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
scanf("%lld",&m);
dfs(1,0);
dfs1(1,1);
build(1,1,n);
for(int i=1;i<=m;i++){
string op;
long long x,y;
cin>>op;
scanf("%lld%lld",&x,&y);
if(op[0]=='C'){
modify(1,1,n,dfn[x],y);
}
else if(op[1]=='S'){
cout<<LCA(x,y)<<endl;
}
else{
cout<<LCA1(x,y)<<endl;
}
}
return 0;
}