#include<bits/stdc++.h>
#define db long double
#define lowbit(x) x&-x
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=4e5+10,mod=998244353;
void fast(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
ll n,x,y,m;
ll a[N],b[N];
ll dep[N],sz[N],hson[N],fa[N],top[N],dfsn[N],id[N];
vector<int> g[N];
struct node{
int l;
int r;
ll sum;
ll maxn;
}tr[N*4];
void pushup(int u){
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
tr[u].maxn=max(tr[u<<1].maxn,tr[u<<1|1].maxn);
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r;
if(l==r){
tr[u].sum=b[l];
tr[u].maxn=b[l];
return;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void modify(int u,int x,ll v){
if(tr[u].l==tr[u].r){
tr[u].sum=tr[u].maxn=v;
return;
}
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid) modify(u<<1,x,v);
else modify(u<<1|1,x,v);
pushup(u);
}
ll query_max(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r)
return tr[u].maxn;
int mid=tr[u].l+tr[u].r>>1;
ll ans=-1e18;
if(l<=mid) ans=max(ans,query_max(u<<1,l,r));
if(r>mid) ans=max(ans,query_max(u<<1|1,l,r));
return ans;
}
ll query_sum(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r)
return tr[u].sum;
int mid=tr[u].l+tr[u].r>>1;
ll ans=0;
if(l<=mid) ans+=query_sum(u<<1,l,r);
if(r>mid) ans+=query_sum(u<<1|1,l,r);
return ans;
}
int cnt=0;
void dfs1(int u){
sz[u]=1;
hson[u]=0;
for(auto x:g[u]){
if(x==fa[u]) continue;
dep[x]=dep[u]+1;
fa[x]=u;
dfs1(x);
sz[u]+=sz[x];
if(sz[hson[u]]<sz[x]) hson[u]=x;
}
}
void dfs2(int u,int t){
dfsn[u]=++cnt;
top[u]=t;
if(hson[u])
dfs2(hson[u],t);
for(auto x:g[u]){
if(x==hson[u]||x==fa[u]) continue;
dfs2(x,x);
}
}
ll query_pathsum(int a,int b){
ll ans=0;
while(top[a]!=top[b]){
if(dep[top[a]<dep[top[b]]]) swap(a,b);
ans=(ans+query_sum(1,dfsn[top[a]],dfsn[a]));
a=fa[top[a]];
}
if(dep[a]>dep[b]) swap(a,b);
ans=(ans+query_sum(1,dfsn[a],dfsn[b]));
return ans;
}
ll query_pathmax(int a,int b){
ll ans=-1e18;
while(top[a]!=top[b]){
if(dep[top[a]<dep[top[b]]]) swap(a,b);
ans=max(ans,query_max(1,dfsn[top[a]],dfsn[a]));
a=fa[top[a]];
}
if(dep[a]>dep[b]) swap(a,b);
ans=max(ans,query_max(1,dfsn[a],dfsn[b]));
return ans;
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
for(int i=1;i<=n;i++) cin>>a[i];
dep[1]=1,fa[1]=1,top[1]=1;
dfs1(1);
dfs2(1,1);
for(int i=1;i<=n;i++) b[dfsn[i]]=a[i];
build(1,1,n);
cin>>m;
string op;
for(int i=1;i<=m;i++){
cin>>op>>x>>y;
if(op=="CHANGE") modify(1,dfsn[x],y);
else if(op=="QMAX") cout<<query_pathmax(x,y)<<endl;
else cout<<query_pathsum(x,y)<<endl;
}
}