#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define ls k<<1
#define rs k<<1|1
const ll maxn =3e4+5;
struct node{
int to,next;
}e[maxn*4];
int h[maxn],cnt,dad[maxn],dep[maxn],fson[maxn],hson[maxn],tp[maxn],id[maxn],num[maxn],z[maxn];
long long read(){
long long ans=0;
char last=' ',ch=getchar();
while(ch<'0' || ch>'9')last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans;
return ans;
}
void add(int u,int v){
e[++cnt].to=v;
e[cnt].next=h[u];
h[u]=cnt;
}
struct meanless{
int l,r;
ll ans,maxn;
}t[maxn*4];
void dfs(int k,int from){
dad[k]=from;
dep[k]=dep[from]+1;
fson[k]=1;
int maxx=0;
for(int i=h[k];i;i=e[i].next){
int v=e[i].to;
if(v!=from) {
dfs(v,k);
fson[k]+=fson[v];
if(fson[v]>maxx) {
hson[k]=v;
maxx=fson[v];
}
}
}
}
void dfs1(int u,int top){
tp[u]=top;
id[u]=++cnt;
num[cnt]=z[u];
if(!hson[u]) return ;
dfs1(hson[u],top);
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;
if(!id[v]) dfs1(v,v);
}
}
void date(int k){
t[k].maxn=max(t[ls].maxn,t[rs].maxn);
t[k].ans=t[ls].ans+t[rs].ans;
return ;
}
void build(int k,int l,int r){
t[k].l=l;
t[k].r=r;
if(l==r){
t[k].ans=num[l];
t[k].maxn=num[l];
return ;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
date(k);
}
void change(int k,int l,int val){
if(t[k].l==l&&t[k].r==l) {
t[k].ans=val;t[k].maxn=val;return ;}
int mid=t[k].l+t[k].r>>1;
if(mid>=l) change(ls,l,val);
if(mid<l) change(rs,l,val);
date(k);
}
ll qmax(int k,int l,int r){
if(t[k].l>=l&&t[k].r<=r) return t[k].maxn;
int mid=t[k].l+t[k].r>>1;
ll temp=0;
if(mid>=l) temp=max(qmax(ls,l,r),temp);
if(mid<r) temp=max(qmax(rs,l,r),temp);
return temp;
}
ll qnum(int k,int l,int r){
if(t[k].l>=l&&t[k].r<=r) return t[k].ans;
int mid=t[k].l+t[k].r>>1;
ll temp=0;
if(mid>=l) temp+=qnum(ls,l,r);
if(mid<r) temp+=qnum(rs,l,r);
return temp;
}
void treemax(int x,int y){
ll temp=0;
while(tp[x]!=tp[y]){
if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
temp=max(qmax(1,id[tp[x]],id[x]),temp);
x=dad[tp[x]];
}
if(dep[x]<dep[y]) swap(x,y);
temp=max(qmax(1,id[y],id[x]),temp);
printf("%lld",temp);
}
void treenum(int x,int y){
ll temp=0;
while(tp[x]!=tp[y]){
if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
temp+=qnum(1,id[tp[x]],id[x]);
x=dad[tp[x]];
}
if(dep[x]<dep[y]) swap(x,y);
temp+=qnum(1,id[y],id[x]);
printf("%lld",temp);
}
int main(){
int n,a,b;cin>>n;
for(int i=1;i<n;++i) {a=read();b=read();add(a,b);add(b,a);}
dfs(1,0);
cnt=0;
for(int i=1;i<=n;++i)
z[i]=read();
dfs1(1,1);
build(1,1,n);
int m;cin>>m;
string ai;
int x,y;
while(m--){
cin>>ai;
if(ai=="CHANGE"){
x=read();y=read();
change(1,id[x],y);
}
if(ai=="QMAX"){
x=read();y=read();
treemax(x,y);
}
if(ai=="QSUM"){
x=read();y=read();
treenum(x,y);
}
}
}