T 了#7和#8
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define int long long
//#define double long double
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
using namespace std;
const int N=3e4+10;
int n,q,fa[N],tot,top[N],dep[N],siz[N],son[N],id[N],a[N],b[N];
vector<int>e[N];
void dfs1(int x,int fat) {
fa[x]=fat;siz[x]=1;dep[x]=dep[fat]+1;
for(int y:e[x]) {
if(y==fat) continue;
dfs1(y,x);
siz[y]+=siz[x];
if(siz[son[x]]<siz[y]) son[x]=y;
}
}
void dfs2(int x,int tp) {
id[x]=++tot;a[tot]=b[x];top[x]=tp;
if(!son[x]) return ;
dfs2(son[x],tp);
for(int y:e[x]) {
if(y==son[x]||y==fa[x]) continue;
dfs2(y,y);
}
}
struct SegmentTree {
int l,r;
int sum,Max;
}t[N<<2];
void push_up(int p) {
t[p].Max=max(t[p<<1].Max,t[p<<1|1].Max);
t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
void Build(int p,int l,int r) {
t[p].l=l,t[p].r=r;
if(l==r) return (void)(t[p].sum=t[p].Max=a[l]);
int mid=l+r>>1;
Build(p<<1,l,mid);
Build(p<<1|1,mid+1,r);
push_up(p);
}
void change(int p,int x,int v) {
if(t[p].l==t[p].r) return (void)(t[p].sum=t[p].Max=v);
int mid=t[p].l+t[p].r>>1;
if(x<=mid) change(p<<1,x,v);
else change(p<<1|1,x,v);
push_up(p);
}
int ask(int p,int l,int r) {
if(l<=t[p].l&&t[p].r<=r) return t[p].sum;
int mid=t[p].l+t[p].r>>1,val=0;
if(l<=mid) val+=ask(p<<1,l,r);
if(r>mid) val+=ask(p<<1|1,l,r);
return val;
}
int askq(int p,int l,int r) {
if(l<=t[p].l&&t[p].r<=r) return t[p].Max;
int mid=t[p].l+t[p].r>>1,val=-1e18;
if(l<=mid) cmax(val,askq(p<<1,l,r));
if(r>mid) cmax(val,askq(p<<1|1,l,r));
return val;
}
int Tree_Max(int x,int y) {
int ans=-1e18;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
cmax(ans,askq(1,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
cmax(ans,askq(1,id[x],id[y]));
return ans;
}
int Tree_sum(int x,int y) {
int ans=0;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=ask(1,id[top[x]],id[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=ask(1,id[x],id[y]);
return ans;
}
main() {
cin>>n;
FOR(i,1,n-1) {
int u,v;
scanf("%lld%lld",&u,&v);
e[u].pb(v),e[v].pb(u);
}
FOR(i,1,n) scanf("%lld",&b[i]);
dfs1(1,0),dfs2(1,1);
Build(1,1,n);
cin>>q;
while(q--) {
char s[10];int u,v;
scanf("%s%lld%lld",s,&u,&v);
if(s[0]=='C') change(1,id[u],v);
if(s[1]=='M') printf("%lld\n",Tree_Max(u,v));
if(s[1]=='S') printf("%lld\n",Tree_sum(u,v));
}
return 0;
}