#include<bits/stdc++.h>
using namespace std;
int n,q,cnt=0,head[550000],nxt[550000],to[550000],u,v;
int w[550000],ans;
int fa[550000],son[550000],dep[550000],size[550000];
int top[550000],dfn[550000],id[550000],l[550000],r[550000],tot=0;
int val1[550000],val2[550000],lazy[550000];
bool pd[550000];
char b[150];
inline void add(int x,int y)
{
to[++cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
}
inline void push_up(int x)
{
val1[x]=val1[2*x]+val1[2*x+1];
val2[x]=max(val2[2*x],val2[2*x+1]);
}
void build(int x,int li,int ri)
{
int mid=(li+ri)>>1;
l[x]=li;r[x]=ri;
if(li==ri)
{
val1[x]=w[id[li]];val2[x]=w[id[li]];
return;
}
build(2*x,li,mid);
build(2*x+1,mid+1,ri);
push_up(x);
}
void modify(int x,int loc,int vl)
{
int mid=(l[x]+r[x])>>1;
if(l[x]==r[x])
{
val1[x]=vl;val2[x]=vl;
return;
}
if(loc<=mid)
modify(x*2,loc,vl);
else
modify(x*2+1,loc,vl);
push_up(x);
}
int ask1(int x,int li,int ri)
{
int mid=(l[x]+r[x])>>1;
if(li==l[x]&&ri==r[x])
return val1[x];
if(ri<=mid)
return ask1(x*2,li,ri);
else if(li>mid)
return ask1(x*2+1,li,ri);
else
return ask1(x*2,li,mid)+ask1(x*2+1,mid+1,ri);
}
int ask2(int x,int li,int ri)
{
int mid=(l[x]+r[x])>>1;
if(li==l[x]&&ri==r[x])
return val2[x];
if(ri<=mid)
return ask2(x*2,li,ri);
else if(li>mid)
return ask2(x*2+1,li,ri);
else
return max(ask2(x*2,li,mid),ask2(x*2+1,mid+1,ri));
}
void dfs1(int x)
{
size[x]=1;pd[x]=1;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(!pd[y])
{
fa[y]=x;dep[y]=dep[x]+1;
dfs1(y);
size[x]+=size[y];
if(size[son[x]]<size[y])
son[x]=y;
}
}
}
void dfs2(int x)
{
if(x!=son[fa[x]])
top[x]=x;
else
top[x]=top[fa[x]];
tot++;dfn[x]=tot;id[tot]=x;
if(son[x])
dfs2(son[x]);
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(y!=fa[x]&&y!=son[x])
dfs2(y);
}
}
int qsum(int x,int y)
{
int ret=0;
while(top[x]!=top[y])
{
if(dep[top[x]]>dep[top[y]])
{
ret+=ask1(1,dfn[top[x]],dfn[x]);x=fa[top[x]];
}
else
{
ret+=ask1(1,dfn[top[y]],dfn[y]);y=fa[top[y]];
}
}
if(dep[x]>dep[y])
ret+=ask1(1,dfn[y],dfn[x]);
else
ret+=ask1(1,dfn[x],dfn[y]);
return ret;
}
long long int qmax(int x,int y)
{
int ret=-1e9;
while(top[x]!=top[y])
{
if(dep[top[x]]>dep[top[y]])
{
ret=max(ret,ask2(1,dfn[top[x]],dfn[x]));x=fa[top[x]];
}
else
{
ret=max(ret,ask2(1,dfn[top[x]],dfn[x]));y=fa[top[y]];
}
}
if(dep[x]>dep[y])
ret=max(ret,ask2(1,dfn[y],dfn[x]));
else
ret=max(ret,ask2(1,dfn[x],dfn[y]));
return ret;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
scanf("%d%d",&u,&v),add(u,v),add(v,u);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
dfs1(1);
dfs2(1);
build(1,1,tot);
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
cin>>b;
if(b[0]=='Q')
{
if(b[1]=='M')
{
scanf("%d%d",&u,&v);
ans=qmax(u,v);
printf("%d\n",ans);
}
else
{
scanf("%d%d",&u,&v);
ans=qsum(u,v);
printf("%d\n",ans);
}
}
else
{
int vg;
scanf("%d%d",&u,&vg);
modify(1,dfn[u],vg);
}
}
return 0;
}