#include <bits/stdc++.h>
using namespace std;
// typedef long long ll;
const int MAXN = 3e4 + 5;
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define mid ((l+r)>>1)
int n;
vector <int> G[MAXN];
int w[MAXN],top[MAXN],siz[MAXN],dep[MAXN],cnt,Hson[MAXN],id[MAXN],f[MAXN];
int s0[MAXN<<2],s1[MAXN<<2];
void dfs0(int u,int fa,int d){
siz[u] = 1;
dep[u] = d + 1;
f[u] = fa;
for (auto i : G[u]){
if (i == fa) continue;
dfs0(i,u,d+1);
siz[u] += siz[i];
if (siz[Hson[u]] < siz[i]){
Hson[u] = i;
}
}
}
void dfs1(int u,int tp){
top[u] = tp;
// dfn[u] = ++cnt;
id[++cnt] = u;
if (!Hson[u]) return ;
dfs1(Hson[u],tp);
for (auto i : G[u]){
if (top[i] == tp) continue;
if (i == Hson[u]) continue;
dfs1(i,i);
}
}
void push_up(int p){
s0[p] = max(s0[ls(p)],s0[rs(p)]);
s1[p] = s1[ls(p)] + s1[rs(p)];
}
void build(int p,int l,int r){
if (l == r){
s0[p] = w[id[l]];
s1[p] = w[id[l]];
return ;
}
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void update(int p,int l,int r,int P,int x){
if (l > P || r < P) return;
if (l==r && l == P){
s0[p] = x;
s1[p] = x;
return;
}
update(ls(p),l,mid,P,x);
update(rs(p),mid+1,r,P,x);
push_up(p);
}
int ask_max(int p,int l,int r,int L,int R){
if (l > R || r < L) return -3000000;
if (l >= L && r <= R){
return s0[p];
}
return max(ask_max(ls(p),l,mid,L,R),ask_max(rs(p),mid+1,r,L,R));
}
int ask_sum(int p,int l,int r,int L,int R){
if (l > R || r < L) return 0;
if (l >= L && r <= R) return s1[p];
return ask_sum(ls(p),l,mid,L,R)+ask_sum(rs(p),mid+1,r,L,R);
}
int query_max(int u,int v){
int ret = -300000000;
while(top[u] != top[v]){
if (dep[top[u]] < dep[top[v]]) swap(u,v);
ret = max(ret,ask_max(1,1,n,id[top[u]],id[u]));
u = f[top[u]];
}
if (dep[u] < dep[v]) swap(u,v);
ret = max(ret,ask_max(1,1,n,id[v],id[u]));
return ret;
}
int query_sum(int u,int v){
int ret = 0;
while(top[u] != top[v]){
if (dep[top[u]] < dep[top[v]]) swap(u,v);
ret += ask_sum(1,1,n,id[top[u]],id[u]);
u = f[top[u]];
}
if (dep[u] < dep[v]) swap(u,v);
ret += ask_sum(1,1,n,id[v],id[u]);
return ret;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i=1;i < n;i++){
int u,v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int i=1;i <= n;i++){
cin >> w[i];
}
dfs0(1,0,0);
dfs1(1,1);
build(1,1,n);
int q;
cin >> q;
while (q--){
string s;
cin >> s;
if (s == "CHANGE"){
int u,t;
cin >> u >> t;
update(1,1,n,id[u],t);
}
else if (s == "QMAX"){
int u,v;
cin >> u >> v;
cout << query_max(u,v) << endl;
}
else{
int u,v;
cin >> u >> v;
cout << query_sum(u,v) << endl;
}
}
return 0;
}
rt