RT
不知道哪里出了问题,求大佬指点
#include<bits/stdc++.h>
#define ll long long
#define lp (p<<1)
#define rp (p<<1|1)
#define mid ((l+r)>>1)
#define len (r-l+1)
#define re register
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=b;i>=a;i--)
#define up t[p].v=t[lp].v+t[rp].v,t[p].mx=m(t[lp].mx,t[rp].mx)
using namespace std;
inline ll read(){
ll w=1,s=0;char ch=getchar();
while(ch<'0'||ch>'9') w=(ch=='-'?-1:1),ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return w*s;
}
const int nn = 3e5+10;
const ll inf = 1e5;
struct node{
ll son,fa,sz,w,top,id,dep;
}a[nn];
struct tree{
ll v,mx;
}t[nn<<2];
struct edge{
ll v,nt;
}e[nn<<1];
inline ll m(ll x,ll y){return x<y?y:x;}
ll n,x,y,op,T;
ll b[nn];
int h[nn],cnt;
string s;
inline void add(ll u,ll v){
e[++cnt].v=v;
e[cnt].nt=h[u];
h[u]=cnt;
}
void dfs1(ll x){
a[x].sz=1;a[x].dep=a[a[x].fa].dep+1;
for(int i=h[x];i;i=e[i].nt){
int y=e[i].v;
if(y==a[x].fa) continue;
a[y].fa=x;
dfs1(y);
a[x].sz+=a[y].sz;
if(!a[x].son||a[a[x].son].sz<a[y].sz)
a[x].son=y;
}
}
int cnt1;
void dfs2(ll x,ll f){
a[x].top=f;
a[x].id=++cnt1;
b[cnt1]=a[x].w;
if(a[x].son)
// return;
dfs2(a[x].son,f);
for(int i=h[x];i;i=e[i].nt){
ll y=e[i].v;
if(y==a[x].fa||y==a[x].son) continue;
dfs2(y,y);
}
}
void build(ll p,ll l,ll r){
if(l==r)
{
t[p].v=t[p].mx=b[l];
return;
}
build(lp,l,mid);
build(rp,mid+1,r);
up;
return;
}
void modify(ll p,ll l,ll r,ll wh,ll v){
if(l==r)
{
t[p].v=t[p].mx=v;
return;
}
if(wh<=mid) modify(lp,l,mid,wh,v);
else modify(rp,mid+1,r,wh,v);
up;
return;
}
tree query(ll p,ll l,ll r,ll L,ll R){
if(L<=l&&r<=R) return t[p];
tree res,res3;
ll res1=0,res2=-inf;
if(L<=mid) res3=query(lp,l,mid,L,R),res1+=res3.v,res2=m(res2,res3.mx);
if(R>mid) res3=query(rp,mid+1,r,L,R),res1+=res3.v,res2=m(res2,res3.mx);
res.mx=res2;res.v=res1;
return res;
}
void work(){
tree ans,res;
ans.v=0;ans.mx=-inf;
if(x>y) swap(x,y);
while(a[x].top!=a[y].top){
if(a[a[x].top].dep<a[a[y].top].dep) swap(x,y);
res=query(1,1,n,a[a[x].top].id,a[x].id);
ans.v+=res.v;ans.mx=m(ans.mx,res.mx);
x=a[a[x].top].fa;
}
if(a[x].top>a[y].top) swap(x,y);
res=query(1,1,n,a[x].id,a[y].id);
ans.v+=res.v;ans.mx=m(ans.mx,res.mx);
printf("%lld\n",(s[1]=='M'?ans.mx:ans.v));
}
int main()
{
n=read();
rep(i,1,n-1) x=read(),y=read(),add(x,y),add(y,x);
rep(i,1,n) a[i].w=read();
dfs1(1);
dfs2(1,1);
build(1,1,n);
T=read();
rep(i,1,T){
cin>>s;x=read();y=read();
if(s[0]=='C') modify(1,1,n,a[x].id,y);
else work();
}
return 0;
}