#include<bits/stdc++.h>
#define int long long
#define LL k<<1
#define RR k<<1|1
#define cur vec[x][i]
using namespace std;
const int N=1e6+1;
vector<int>vec[N];
int son[N],fa[N],n,top[N],l[N],dep[N],rmax,rsum,size[N],b[N],a[N];
set<int>st[N];
struct Node{
int sum,maxn,l,r;
}t[4*N];
inline void pushup(int k){t[k].sum=t[LL].sum+t[RR].sum;t[k].maxn=max(t[LL].maxn,t[RR].maxn);}
inline void build(int k,int l,int r){
t[k].l=l;
t[k].r=r;
if(l==r){
t[k].sum=a[l];
t[k].maxn=a[l];
return;
}
int mid=(l+r)>>1;
build(LL,l,mid);
build(RR,mid+1,r);
pushup(k);
}
inline void querymax(int k,int l,int r){
if(t[k].l <= r && t[k].r >= l){
if(l<=t[k].l && r>=t[k].r){
rmax=max(rmax,t[k].maxn);
return;
}
int mid=(t[k].l+t[k].r)>>1;
if(mid >= l){
querymax(LL,l,r);
}
if(mid < r){
querymax(RR,l,r);
}
}
}
inline void querysum(int k,int l,int r){
if(t[k].l <= r && t[k].r >= l){
if(l<=t[k].l && r>=t[k].r){
rsum+=t[k].sum;
return;
}
int mid=(t[k].l+t[k].r)>>1;
if(mid >= l){
querysum(LL,l,r);
}
if(mid < r){
querysum(RR,l,r);
}
}
}
inline void update(int k,int u,int v){
if(t[k].l <= u && t[k].r >= u){
if(t[k].l == t[k].r){
t[k].sum=v;
t[k].maxn=v;
return;
}
int mid=(t[k].l+t[k].r)>>1;
if(mid >= u){
update(LL,u,v);
}
if(mid < u){
update(RR,u,v);
}
pushup(k);
}
}
inline void dfspt1(int x) {
size[x]=1;
for(int i=0; i<vec[x].size(); i++) {
if(cur != fa[x]) {
dep[cur]=dep[x]+1,fa[cur]=x;
dfspt1(cur),size[x]+=size[cur];
if(size[cur] > size[son[x]])son[x]=cur;
}
}
}
int tot;
inline void dfspt2(int x,int t) {
l[x]=++tot;
a[tot]=b[x];
top[x]=t;
if(son[x])dfspt2(son[x],t);
for(int i=0; i<vec[x].size(); i++) {
if(cur!=fa[x]&&cur!=son[x]) {
dfspt2(cur,cur);
}
}
}
inline int fmax(int a,int b){
int maxn=-2147483647ll;
while(top[a]!=top[b]){
if(dep[top[a]] < dep[top[b]]){
swap(a,b);
}
rmax=-2147483647ll;
querymax(1,l[top[a]],l[a]);
maxn=max(maxn,rmax);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
rmax=-2147483647ll;
querymax(1,l[a],l[b]);
maxn=max(maxn,rmax);
return maxn;
}
inline int fsum(int a,int b){
int sum=0;
while(top[a] != top[b]){
if(dep[top[a]] < dep[top[b]])swap(a,b);
rsum=0;
querysum(1,l[top[a]],l[a]);
sum+=rsum;
a=fa[top[a]];
}
if(dep[a] > dep[b])swap(a,b);
rsum=0;
querysum(1,l[a],l[b]);
sum+=rsum;
return sum;
}
signed main() {
cin>>n;
for(int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
vec[u].push_back(v);
vec[v].push_back(u);
}
for(int i=1;i<=n;i++)cin>>b[i];
dfspt1(1);
dfspt2(1,1);
build(1,1,n);
int Q;
cin>>Q;
while(Q--){
string s;
int lx,r;
cin>>s>>lx>>r;
if(s=="QMAX"){
cout<<fmax(lx,r)<<'\n';
}
if(s=="QSUM"){
cout<<fsum(lx,r)<<'\n';
}
if(s=="CHANGE"){
update(1,lx,r);
}
}
return 0;
}