#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=(k+1);++i)
using namespace std;
typedef long long ll;
const int N=3e5+7;
inline void read(int &x)
{
x=0;register char ch=getchar();
int w=0;
while (ch>'9'||ch<'0'){
w|=ch=='-';ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-48;
ch=getchar();
}
w?x=~(x-1):x;
}
//inline void swap(int &a,int &b)
//{
// a==b? 1:a^=b^=a^=b;
//}
inline void out(int x) {
if(x<0) x=-x,putchar('-');
if(x==0) {
putchar('0'),putchar('\n');
return ;
}
if(x<10) {
putchar(x+48);
putchar('\n');
return ;
}
char ch[50];
int num(0);
while(x) {
ch[++num]=x%10+48;
x/=10;
}
while(num) putchar(ch[num--]);
putchar('\n');
}
struct graph {
int head[N<<1],next[N<<1],tot,ver[N<<1];
inline void add(int a,int b) {
ver[++tot]=b;
next[tot]=head[a];
head[a]=tot;
}
} G;
int n,q;
int a[N],b[N];
int son[N<<1],dfn[N<<1],fa[N<<1],num;
int dep[N<<1],size[N<<1],top[N<<1];
inline void dfs1(int x,int fath)
{
dep[x]=dep[fath]+1;
fa[x]=fath;
size[x]=1;
int maxson=-1;
for (register int i(G.head[x]);i;i=G.next[i])
{
int y(G.ver[i]);
if(y==fath) continue;
dfs1(y,x);
size[x]+=size[y];
if(size[y]>maxson) maxson=size[y],son[x]=y;
}
}
inline void dfs2(int x,int topf)
{
dfn[x]=++num;
a[num]=b[x];
top[x]=topf;
if(!son[x]) return;
dfs2(son[x],topf);
for(register int i(G.head[x]);i;i=G.next[i]){
int y(G.ver[i]);
if(dfn[y]) continue;
dfs2(y,y);
}
}
inline int max(int &x,int &y){
return x>y? x:y;
}
struct Segmentree{
int lc[N<<1],rc[N<<1],root,cnt,maxx[N<<1];
ll sum[N<<1];
inline void insert(int &p,int L,int R,int x,int v)
{
if(!p) p=++cnt;
if(L==R)
{
sum[p]=v;
maxx[p]=v;
return ;
}
int mid((L+R)>>1);
if(x<=mid) insert(lc[p],L,mid,x,v);
else insert(rc[p],mid+1,R,x,v);
maxx[p]=max(maxx[lc[p]],maxx[rc[p]]);
sum[p]=sum[lc[p]]+sum[rc[p]];
}
inline int qmax(int p,int L,int R,int ll,int rr)
{
if(!p) return -2147483;
if(ll<=L&&rr>=R)
return maxx[p];
int mid=((L+R)>>1);
int val=-3e4-5;
if(ll<=mid) val=max(val,qmax(lc[p],L,mid,ll,rr));
if(rr>mid) val=max(val,qmax(rc[p],mid+1,R,ll,rr));
return val;
}
inline ll qsum(int p,int L,int R,int ll,int rr)
{
if(!p) return 0;
if(ll<=L&&rr>=R)
return sum[p];
int mid((L+R)>>1);
int val(0);
if(ll<=mid) val+=qsum(lc[p],L,mid,ll,rr);
if(rr>mid) val+=qsum(rc[p],mid+1,R,ll,rr);
return val;
}
}S;
inline ll qsmchain(int x,int y){
ll ans(0);
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=S.qsum(S.root,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=S.qsum(S.root,1,n,dfn[x],dfn[y]);
return ans;
}
inline int qmxchain(int x,int y)
{
int ans(-3e4);
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,S.qmax(S.root,1,n,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans=max(ans,S.qmax(S.root,1,n,dfn[x],dfn[y]));
return ans;
}
int main()
{
int aa,bb;
read(n);
rep(i,1,n-1)
{
read(aa);read(bb);
G.add(aa,bb);
G.add(bb,aa);
}
rep(i,1,n) read(b[i]);
dfs1(1,0);
dfs2(1,1);
rep(i,1,n) S.insert(S.root,1,n,i,a[i]);
read(q);
string op;
int x,y;
while(q--)
{
cin>>op>>x>>y;
if(op=="CHANGE"){
S.insert(S.root,1,n,x,y);
}
else if(op=="QMAX")
{
out(qmxchain(x,y));
}
else if(op=="QSUM")
{
cout<<qsmchain(x,y)<<endl;
// out(qsmchain(x,y));
}
}
return 0;
}
/*
4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4
*/
调数据结构,白了少年头