样例1 RE,求调。
//Author : mairuisheng
//#pragma GCC optimize(3)
#include<iostream>
#include<vector>
using namespace std;
inline int read()
{
int x=0,f=1;
char s;
s=getchar();
while(s<48||s>57)
{
if(s=='-')f=-f;
s=getchar();
}
while(s>47&&s<58)
{
x=(x<<3)+(x<<1)+(s-48);
s=getchar();
}
return x*f;
}
constexpr int N=3e4+1;
int n,q;
vector<int> g[N];
int fat[N],son[N],sz[N],top[N],dep[N],seg[N<<2],rev[N<<2];
int mx[N<<2],sum[N<<2];
int a[N];
int ansmx,anssum;
void dfs(int u,int fa)
{
fat[u]=fa;
sz[u]=1;
dep[u]=dep[fa]+1;
for(auto v:g[u])
{
if(v==fa)continue;
dfs(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]])son[u]=v;
}
}
void dfs2(int u)
{
if(!son[u])return;
seg[son[u]]=++seg[0];
rev[seg[0]]=son[u];
top[son[u]]=top[u];
dfs2(son[u]);
for(auto v:g[u])
{
if(v==fat[u]||v==son[u])continue;
seg[v]=++seg[0];
rev[seg[0]]=v;
top[v]=v;
dfs2(v);
}
}
void Build(int x,int l,int r)
{
if(l==r)
{
sum[x]=mx[x]=a[rev[l]];
return;
}
int mid=l+r>>1;
Build(x<<1,l,mid);
Build(x<<1|1,mid+1,r);
sum[x]=sum[x<<1]+sum[x<<1|1];
mx[x]=max(mx[x<<1],mx[x<<1|1]);
}
void Change(int x,int l,int r,int v,int pos)
{
if(l==r&&l==pos)
{
sum[x]=mx[x]=a[rev[pos]]=v;
return;
}
int mid=l+r>>1;
if(mid>=pos)Change(x<<1,l,mid,v,pos);
if(mid<pos)Change(x<<1|1,mid+1,r,v,pos);
sum[x]=sum[x<<1]+sum[x<<1|1];
mx[x]=max(mx[x<<1],mx[x<<1|1]);
}
inline void Query(int x,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
ansmx=max(ansmx,mx[x]);
anssum+=sum[x];
return;
}
int mid=l+r>>1;
if(l<=mid)Query(x<<1,l,mid,ql,qr);
if(mid<r)Query(x<<1|1,mid+1,r,ql,qr);
}
void Ask(int u,int v)
{
int fu=top[u],fv=top[v];
while(fu!=fv)
{
if(dep[fu]<dep[fv])
{
swap(fu,fv);
swap(u,v);
}
Query(1,1,seg[0],seg[fu],seg[u]);
u=fat[fu];
fu=top[u];
}
if(dep[u]<dep[v])swap(u,v);
Query(1,1,seg[0],seg[v],seg[u]);
}
int main()
{
n=read();
int i,u,v;
for(i=1;i<n;++i)
{
u=read();
v=read();
g[u].push_back(v);
g[v].push_back(u);
}
for(i=1;i<=n;++i)a[i]=read();
dfs(1,0);
seg[0]=seg[1]=top[1]=rev[1]=1;
dfs2(1);
Build(1,1,seg[0]);
q=read();
string s;
while(q--)
{
cin>>s;
u=read();
v=read();
if(s[0]=='C')Change(1,1,seg[0],v,seg[u]);
else
{
anssum=0;
ansmx=-N;
Ask(u,v);
if(s[1]=='M')printf("%d\n",ansmx);
else printf("%d\n",anssum);
}
}
return 0;
}