#include<bits/stdc++.h>
#define int long long
namespace Fast{
template <typename T>
inline T read(){
char c=getchar();
T x=0;
int w=1;
while(c<'0'||c>'9'){
if(c=='-') w=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+(c-'0');
c=getchar();
}
return x*w;
}
inline void write(int x,char c){
static int sta[35];
int tot=0;
if(x<0) putchar('-'),x=-x;
do{
sta[tot++]=x%10,x/=10;
}while(x);
while(tot) putchar(sta[--tot]+'0');
putchar(c);
}
}
using Fast::read;
using Fast::write;
const int MAXN=1e6;
int fa[MAXN],top[MAXN],son[MAXN],siz[MAXN],dep[MAXN],id[MAXN],ID[MAXN],cnt;
int n,m,a[MAXN];
std::vector<int> v[MAXN];
struct node{
int l,r,max,sum;
}tr[4*MAXN];
inline void dfs_1(int x,int f){
fa[x]=f,siz[x]=1,dep[x]=dep[f]+1;
for(auto it:v[x]){
if(it!=f){
dfs_1(it,x);
siz[x]+=siz[it];
if(siz[son[x]]<siz[it]) son[x]=it;
}
}
}
inline void dfs_2(int x,int t){
top[x]=t,id[x]=++cnt,ID[cnt]=x;
if(!son[x]) return ;
dfs_2(son[x],t);
for(auto it:v[x]){
if(it!=son[x]&&it!=fa[x])dfs_2(it,it);
}
}
#define lc rt<<1
#define rc rt<<1|1
inline void push_up(const int&rt){
tr[rt].sum=tr[lc].sum+tr[rc].sum;
tr[rt].max=std::max(tr[lc].max,tr[rc].max);
}
inline void Build(int rt,int l,int r){
tr[rt].l=l,tr[rt].r=r;
if(l==r){
tr[rt].sum=tr[rt].max=a[ID[l]];
return ;
}
int mid=l+r>>1;
Build(lc,l,mid),Build(rc,mid+1,r);
push_up(rt);
}
inline int sum(int rt,const int &l,const int &r){
if(l<=tr[rt].l&&r>=tr[rt].r) return tr[rt].sum;
int mid=tr[rt].l+tr[rt].r>>1,ans=0;
if(l<=mid) ans+=sum(lc,l,r);
if(r>mid) ans+=sum(rc,l,r);
return ans;
}
inline int max(int rt,const int&l,const int&r){
if(l<=tr[rt].l&&r>=tr[rt].r) return tr[rt].max;
int mid=tr[rt].l+tr[rt].r>>1,ans=INT_MIN;
if(l<=mid) ans=std::max(ans,max(lc,l,r));
if(r>mid) ans=std::max(ans,max(rc,l,r));
return ans;
}
inline void update(int rt,const int&i,const int&x){
if(tr[rt].l==tr[rt].r&&i==tr[rt].l){
tr[rt].sum=tr[rt].max=x;
return ;
}
int mid=tr[rt].l+tr[rt].r>>1;
if(i<=mid) update(lc,i,x);
else update(rc,i,x);
push_up(rt);
}
inline int query_sum(int u,int v){
int ans=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) std::swap(u,v);
ans=ans+sum(1,id[top[u]],id[u]);
u=fa[top[u]];
}
if(dep[u]<dep[v]) std::swap(u,v);
ans=ans+sum(1,id[v],id[u]);
return ans;
}
inline int query_max(int u,int v){
int ans=INT_MIN;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) std::swap(u,v);
ans=std::max(ans,max(1,id[top[u]],id[u]));
u=fa[top[u]];
}
if(dep[u]<dep[v]) std::swap(u,v);
ans=std::max(ans,max(1,id[v],id[u]));
return ans;
}
signed main(){
n=read<int>();
for(int i=1;i<n;i++){
int x,y;
x=read<int>(),y=read<int>();
v[x].push_back(y);
v[y].push_back(x);
}
for(int i=1;i<=n;i++) a[i]=read<int>();
dfs_1(1,0),dfs_2(1,1),Build(1,1,n);
m=read<int>();
while(m--){
std::string op;
int x,y;
std::cin>>op;
x=read<int>(),y=read<int>();
if(op=="CHANGE") update(1,x,y);
if(op=="QMAX") write(query_max(x,y),'\n');
if(op=="QSUM") write(query_sum(x,y),'\n');
}
return 0;
}