RT;
尽己所能调了;
请不吐槽变量名/码风(我是异端)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define bug cout<<"error"<<"\n";
#define inf -0x7f7f7f7f
const int N=1e6+10;
ll m,n,s;
struct node {
int l,r;
ll dat,rmq;
} t[N<<2];
int top[N],dep[N],siz[N],son[N],f[N],id[N];
ll w[N],sw[N];
int v[N<<1],ne[N<<1],h[N];
ll ans,cnt,tot,tim;
void add(int x,int y) {
v[++cnt]=y,ne[cnt]=h[x],h[x]=cnt;
}
int max(int a,int b) {
return a>b?a:b;
}
void pushup(int p) {
t[p].rmq=max(t[p<<1].rmq,t[p<<1|1].rmq);
t[p].dat=t[p<<1].dat+t[p<<1|1].dat;
}
void build(int p,int l,int r) {
t[p].l=l,t[p].r=r;
if(l==r){
t[p].dat=t[p].rmq=sw[l];
return;
}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
return;
}
void update(int p,int x,ll ad) {
if(t[p].l==t[p].r&&t[p].l==x){
t[p].dat=t[p].rmq=ad;
return;
}
int mid=t[p].l+t[p].r>>1;
if(x<=mid)update(p<<1,x,ad);
else update(p<<1|1,x,ad);
pushup(p);
}
ll query(int p,int l,int r) {
if(l<=t[p].l&&r>=t[p].r)return t[p].dat;
ll sum=0;
int mid=t[p].l+t[p].r>>1;
if(l<=mid)sum+=query(p<<1,l,r);
if(r>mid)sum+=query(p<<1|1,l,r);
return sum;
}
ll query1(int p,int l,int r) {
if(l<=t[p].l&&r>=t[p].r)return t[p].rmq;
ll sum=inf;
int mid=t[p].l+t[p].r>>1;
if(l<=mid)sum=max(sum,query1(p<<1,l,r));
if(r>mid)sum=max(sum,query1(p<<1|1,l,r));
return sum;
}
void dfs1(int x,int fa) {
dep[x]=dep[fa]+1;
f[x]=fa;
siz[x]=1;
for(int i=h[x];i;i=ne[i]){
int y=v[i];
if(y!=fa){
dfs1(y,x);
siz[x]+=siz[y];
if(siz[y]>siz[son[x]])son[x]=y;
}
}
}
void dfs2(int x,int tp) {
top[x]=tp;
id[x]=++tim;
sw[tim]=w[x];
if(!son[x])return;
dfs2(son[x],tp);
for(int i=h[x]; i; i=ne[i]) {
int y=v[i];
if(y!=f[x]&&y!=son[x])dfs2(y,y);
}
}
ll qsum(int x,int y) {
ll res=0;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]])swap(x,y);
res+=query(1,id[top[x]],id[x]);
x=f[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
res+=query(1,id[x],id[y]);
return res;
}
ll qrmq(int x,int y) {
ll res=inf;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]])swap(x,y);
res=max(res,query1(1,id[top[x]],id[x]));
x=f[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
res=max(res,query1(1,id[x],id[y]));
return res;
}
ll qr() {
ll res=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch)) {
res=(res<<1)+(res<<3)+(ch^48);
ch=getchar();
}
return res;
}
signed main() {
n=qr();
ll x,y;
for(int i=1; i<n; i++) {
x=qr(),y=qr();
add(x,y);
add(y,x);
}
for(int i=1; i<=n; i++)w[i]=qr();
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
m=qr();
while(m--) {
string c;
cin >> c;
scanf("%lld%lld",&x,&y);
if(c[0]=='C')update(1,id[x],y);
else if(c[1]=='M')printf("%lld\n",qrmq(x,y));
else if(c[1]=='S')printf("%lld\n",qsum(x,y));
}
return 0;
}