#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000003;
struct node{
int fa,maxxson,son,dep,top,num;
}l[N];
struct Node{
int to,nxt;
}z[N];
struct mode{
int l,r,sum,maxx;
}t[4*N];
int a[N];
int h[N];
int w[N];
int Num;
int root;
void dfs(int x,int fa){
l[x].son=1;
l[x].dep=l[fa].dep+1;
l[x].fa=fa;
l[l[x].maxxson].son=-1;
for(int i=h[x];i;i=z[i].nxt){
int y=z[i].to;
if(y==fa) continue;
else{
dfs(y,x);
l[x].son+=l[y].son;
if(l[y].son>l[l[x].maxxson].son){
l[x].maxxson=y;
l[l[x].maxxson].son=l[y].son;
}
}
}
}
void dfs1(int x,int fa,int Top){
Num++;
l[x].num=Num;
l[x].top=Top;
w[Num]=a[x];
if(!l[x].maxxson) return ;
else{
dfs1(l[x].maxxson,x,Top);
}
for(int i=h[x];i;i=z[i].nxt){
int y=z[i].to;
if(y==fa||y==l[x].maxxson) continue;
else{
dfs1(y,x,y);
}
}
}
int n,q;
int cnt;
void add(int a,int b){
cnt++;
z[cnt].to=b;
z[cnt].nxt=h[a];
h[a]=cnt;
}
void chan(int x,int p,int k ){
if(t[k].l==t[k].r){
t[k].sum=p;
t[k].maxx=p;
return ;
}
int mid=t[k].l+t[k].r>>1;
if(x<=mid){
chan(x,p,k*2);
}
else{
chan(x,p,k*2+1);
}
t[k].maxx=max(t[k*2].maxx,t[k*2+1].maxx);
t[k].sum=t[k*2].sum+t[k*2+1].sum;
}
void build(int l,int r,int k){
t[k].l=l;
t[k].r=r;
if(l==r){
t[k].sum=w[l];
t[k].maxx=w[l];
return ;
}
int mid=l+r>>1;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
t[k].sum=t[k*2].sum+t[k*2+1].sum;
t[k].maxx=max(t[k*2].maxx,t[k*2+1].maxx);
}
int query_tree(int l,int r,int k){
if(t[k].l>=l&&t[k].r<=r){
return t[k].maxx;
}
int mid=t[k].l+t[k].r>>1;
int ans=-1;
if(l<=mid) ans=query_tree(l,r,k*2);
if(r>mid) ans=max(ans,query_tree(l,r,k*2+1));
return ans;
}
int qury(int a,int b){
int ans=-0x3f3f3f3f3f;
while(l[a].top!=l[b].top){
if(l[l[a].top].dep<l[l[b].top].dep){
swap(a,b);
}
ans=max(ans,query_tree(l[l[a].top].num,l[a].num,1));
a=l[l[a].top].fa;
}
if(l[a].dep>l[b].dep) swap(a,b);
ans=max(ans,query_tree(l[a].num,l[b].num,1));
return ans;
}
int quury_tree(int l,int r,int k){
if(t[k].l>=l&&t[k].r<=r){
return t[k].sum;
}
int mid=t[k].l+t[k].r>>1;
int ans=0;
if(l<=mid) ans+=quury_tree(l,r,k*2);
if(r>mid) ans+=quury_tree(l,r,k*2+1);
return ans;
}
int quury(int a,int b){
int ans=0;
while(l[a].top!=l[b].top){
if(l[l[a].top].dep<l[l[b].top].dep){
swap(a,b);
}
ans+=quury_tree(l[l[a].top].num,l[a].num,1);
a=l[l[a].top].fa;
}
if(l[a].dep>l[b].dep) swap(a,b);
ans+=quury_tree(l[a].num,l[b].num,1);
return ans;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<n;i++){
int a,b;
scanf("%lld%lld",&a,&b);
add(a,b);
add(b,a);
}
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
scanf("%lld",&q);
l[0].dep=0;
dfs(1,0);
dfs1(1,0,1);
build(1,n,1);
for(int i=1;i<=q;i++){
string s;
cin>>s;
if(s=="CHANGE"){
int u,t;
scanf("%lld%lld",&u,&t);
chan(u,t,1);
}
if(s=="QMAX"){
int u,v;
scanf("%lld%lld",&u,&v);
int ans=qury(u,v);
printf("%lld\n",ans);
}
if(s=="QSUM"){
int u,v;
scanf("%lld%lld",&u,&v);
int ans=quury(u,v);
printf("%lld\n",ans);
}
}
}