不知道为什么TLE+RE
#include <bits/stdc++.h>
#define MAXN 100007
using namespace std;
struct node{int l,r,w,m;}t[MAXN*4];
int n,m,cnt,num,a[MAXN],nxt[MAXN*2],lst[MAXN*2],edge[MAXN],size[MAXN],deep[MAXN],son[MAXN],fa[MAXN],id[MAXN],di[MAXN],top[MAXN];
inline int read()
{
int s=0,w=1; char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') w=-1;
for (; isdigit(c);c=getchar()) s=(s<<3)+(s<<1)+c^48;
return (s*w);
}
void add(int x,int y) {nxt[++cnt]=x; lst[cnt]=edge[y]; edge[y]=cnt;}
void dfs1(int k)
{
size[k]=1;
for (int i=edge[k];i;i=lst[i])
{
int now=nxt[i];
if (now==fa[k]) continue;
fa[now]=k;
deep[now]=deep[k]+1;
dfs1(now);
size[k]=size[k]+size[now];
if (size[now]>size[son[k]]) son[k]=now;
}
}
void dfs2(int k,int faa)
{
top[k]=faa;
id[k]=++num;
di[num]=k;
if (son[k]) dfs2(son[k],faa);
for (int i=edge[k];i;i=lst[i])
{
int now=nxt[i];
if (now==fa[k]||now==son[k]) continue;
dfs2(now,now);
}
}
void build(int k,int l,int r)
{
t[k].l=l,t[k].r=r;
if (l==r) {t[k].w=t[k].m=a[di[l]]; return;}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
t[k].w=t[k<<1].w+t[k<<1|1].w;
t[k].m=max(t[k<<1].m,t[k<<1|1].m);
}
void change(int k,int w,int v)
{
if (t[k].l==t[k].r) {t[k].w=t[k].m=v; return;}
int mid=(t[k].l+t[k].r)>>1;
if (w<=mid) change(k<<1,w,v);
if (w>=mid+1) change(k<<1|1,w,v);
t[k].w=t[k<<1].w+t[k<<1|1].w;
t[k].m=max(t[k<<1].m,t[k<<1|1].m);
}
int querys(int k,int l,int r)
{
if (l<=t[k].l&&t[k].r<=r) return(t[k].w);
int mid=(t[k].l+t[k].r)>>1;
int anss=0;
if (l<=mid) anss=anss+querys(k<<1,l,r);
if (r>=mid+1) anss=anss+querys(k<<1|1,l,r);
return anss;
}
int querym(int k,int l,int r)
{
if (l<=t[k].l&&t[k].r<=r) return(t[k].m);
int mid=(t[k].l+t[k].r)>>1;
int anss=-300005;
if (l<=mid) anss=max(anss,querym(k<<1,l,r));
if (r>=mid+1) anss=max(anss,querym(k<<1|1,l,r));
return anss;
}
int main()
{
n=read();
for (int i=1;i<=n-1;i++)
{
int x=read(),y=read();
add(x,y);
add(y,x);
}
for (int i=1;i<=n;i++) a[i]=read();
dfs1(1);
dfs2(1,1);
build(1,1,n);
m=read();
for (int i=1;i<=m;i++)
{
char s[10];
int x,y;
scanf("%s%d%d",s,&x,&y);
if (s[0]=='C') change(1,id[x],y);
if (s[1]=='M')
{
int ans=-300005;
while (top[x]!=top[y])
{
if (deep[top[x]]<deep[top[y]]) swap(x,y);
ans=max(ans,querym(1,id[top[x]],id[x]));
x=fa[top[x]];
}
if (deep[x]>deep[y]) swap(x,y);
ans=max(ans,querym(1,id[x],id[y]));
printf("%d\n",ans);
}
if (s[1]=='S')
{
int ans=0;
while (top[x]!=top[y])
{
if (deep[top[x]]<deep[top[y]]) swap(x,y);
ans=ans+querys(1,id[top[x]],id[x]);
x=fa[top[x]];
}
if (deep[x]>deep[y]) swap(x,y);
ans=ans+querys(1,id[x],id[y]);
printf("%d\n",ans);
}
}
return 0;
}