#include <bits/stdc++.h>
#define pc putchar(' ')
#define pe putchar('\n')
using namespace std;
template<typename T>void read(T& n)
{
T f=1,k=0;char c=getchar();
while(c>'9'||c<'0'){if(c=='-'){f=-1;}c=getchar();}
while(c<='9'&&c>='0'){k=(k<<3)+(k<<1)+c-'0';c=getchar();}
n=f*k;
}
template<typename T>void write(T x)
{
if(x==0){putchar('0');return;}
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
const int maxn=3*1e4+10;
int siz[maxn],wc[maxn],top[maxn],fa[maxn],dep[maxn],tot,dfn[maxn],rdfn[maxn];
vector<int> e[maxn];
int n,q,a[maxn];
char tmp[10];
void dfs1(int u,int f)
{
dep[u]=dep[f]+1,fa[u]=f,siz[u]=1;
for(int v:e[u])
{
if(v==f)continue;
dfs1(v,u);
siz[u]+=siz[v];
wc[u]=(siz[v]>siz[wc[u]]?v:wc[u]);
}
}
void dfs2(int u,int t)
{
top[u]=t,dfn[u]=++tot,rdfn[u]=tot;
if(wc[u])dfs2(wc[u],t);
for(int v:e[u])
{
if(v==fa[u]||v==wc[u])continue;
dfs2(v,v);
}
}
#define ls rt<<1
#define rs rt<<1|1
#define mid ((l+r)>>1)
struct sgt
{
int l,r,maxx,sum;
}t[maxn<<2];
void pushup(int rt)
{
t[rt].maxx=max(t[ls].maxx,t[rs].maxx);
t[rt].sum=t[ls].sum+t[rs].sum;
}
void build(int rt,int l,int r)
{
t[rt].l=l,t[rt].r=r;
if(l==r)
{
t[rt].maxx=t[rt].sum=a[rdfn[l]];
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(rt);
}
void update(int rt,int idx,int x)
{
int l=t[rt].l,r=t[rt].r;
if(l==r)
{
t[rt].maxx=t[rt].sum=x;
return;
}
if(idx<=mid)update(ls,idx,x);
else update(rs,idx,x);
pushup(rt);
}
int quemax(int rt,int ql,int qr)
{
int l=t[rt].l,r=t[rt].r,ans=INT_MIN;
if(ql<=l&&r<=qr)return t[rt].maxx;
if(ql<=mid)ans=max(ans,quemax(ls,ql,qr));
if(qr>mid) ans=max(ans,quemax(rs,ql,qr));
return ans;
}
int quesum(int rt,int ql,int qr)
{
int l=t[rt].l,r=t[rt].r,ans=0;
if(ql<=l&&r<=qr)return t[rt].sum;
if(ql<=mid)ans+=quesum(ls,ql,qr);
if(qr>mid) ans+=quesum(rs,ql,qr);
return ans;
}
int qmax(int x,int y)
{
int ans=INT_MIN;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,quemax(1,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
ans=max(ans,quemax(1,min(dfn[x],dfn[y]),max(dfn[x],dfn[y])));
return ans;
}
int qsum(int x,int y)
{
int ans=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=ans+quesum(1,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
ans=ans+quesum(1,min(dfn[x],dfn[y]),max(dfn[x],dfn[y]));
return ans;
}
int main()
{
read(n);
for(int i=1,u,v;i<n;i++)
{
read(u),read(v);
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;i++)read(a[i]);
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
read(q);
for(int i=1,u,v;i<=q;i++)
{
scanf("%s",tmp),read(u),read(v);
if(tmp[1]=='H')update(1,dfn[u],v);
else if(tmp[1]=='M')write(qmax(u,v)),pe;
else write(qsum(u,v)),pe;
}
return 0;
}