#include<bits/stdc++.h>
using namespace std;
const int mx=2000001;
#define int long long
int a[mx],d[mx],re[mx],f[mx],size[mx];
int son[mx],n,m,top[mx],summ,num=0,id[mx];
vector<int>ver[mx];
int edge[mx];
void add(int x,int y)
{
ver[x].push_back(y);
ver[y].push_back(x);
}
struct re
{
long long sum;
int l,r;
long long maxn;
#define sum(x) tree[x].sum
#define l(x) tree[x].l
#define r(x) tree[x].r
#define mx(x) tree[x].maxn
}tree[mx*4];
void build(int p,int l,int r)
{
l(p)=l;r(p)=r;
if(l==r)
{
sum(p)=mx(p)=edge[re[l]];
return;
}
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
sum(p)=sum(p*2)+sum(p*2+1);
mx(p)=max(mx(p*2),mx(p*2+1));
}
void change(int p,int x,int v){
if(l(p)==r(p))
{
sum(p)=v;
mx(p)=v;
return ;
}
int mid=(l(p)+r(p))/2;
if(x<=mid)change(p*2,x,v);
else change(p*2+1,x,v);
sum(p)=sum(p*2)+sum(p*2+1);
mx(p)=max(mx(p*2),mx(p*2+1));
}
int ask1(int p,int l,int r)//sum
{
if(l<=l(p)&&r>=r(p))
{
return sum(p);
}
int mid=(l(p)+r(p))>>1;
int val=0;
if(l<=mid)
{
val+=ask1(p*2,l,r);
}
if(r>mid)val+=ask1(p*2+1,l,r);
return val;
}
int ask2(int p,int l,int r)//max
{
if(l<=l(p)&&r>=r(p))
{
return mx(p);
}
int mid=(l(p)+r(p))>>1;
int val=-999999999;
if(l<=mid)
{
val=max(val,ask2(p*2,l,r));
}
if(r>mid)
{
val=max(val,ask2(p*2+1,l,r));
}
return val;
}
void dfs1(int x,int fa)
{
f[x]=fa;size[x]=1;
for(int i=0;i<ver[x].size();i++)
{
int y=ver[x][i];
if(y==fa)continue;
d[y]=d[x]+1;
dfs1(y,x);
size[x]+=size[y];
if(size[y]>size[son[x]])son[x]=y;
}
}
void dfs2(int x,int t)
{
top[x]=t;
id[x]=++num;
re[num]=x;
if(!son[x])return;
dfs2(son[x],t);
for(int i=0;i<ver[x].size();i++)
{
int y=ver[x][i];
if(y==f[x]||y==son[x])continue;
dfs2(y,y);
}
}
int qsum(int x,int y)
{
int res=0;
while(top[x]!=top[y])
{
if(d[top[x]]<d[top[y]])swap(x,y);
res+=ask1(1,id[top[x]],id[x]);
x=f[top[x]];
}
if(d[x]>d[y])swap(x,y);
res+=ask1(1,id[x],id[y]);
return res;
}
int qmax(int x,int y)
{
int res=-999999999;
while(top[x]!=top[y])
{
if(d[top[x]]<d[top[y]])swap(x,y);
res=max(res,ask2(1,id[top[x]],id[x]));
x=f[top[x]];
}
if(d[x]>d[y])swap(x,y);
res=ask2(1,id[x],id[y]);
return res;
}
signed main()
{
int a,b;
cin>>n;
for(int i=1;i<n;i++)
{
cin>>a>>b;
add(a,b);
}
for(int i=1;i<=n;i++)
{
cin>>a;
edge[i]=a;
}
d[1]=1;dfs1(1,0);
dfs2(1,1);
build (1,1,n);
string s;int q;
cin>>q;
for(int i=1;i<=q;i++)
{
cin>>s>>a>>b;
if(s=="QMAX")
{
cout<<qmax(a,b)<<endl;
}
if(s=="CHANGE")
{
change(1,id[a],b);
}
if(s=="QSUM")
{
cout<<qsum(a,b)<<endl;
}
}
return 0;
}