RT
只等过第5、6个点,其余全WA,死活调不出来QAQ。
#include<bits/stdc++.h>
#define int long long
#define M 300005
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
inline int lc(int k){return (k<<1);}
inline int rc(int k){return (k<<1)+1;}
int top[M],size[M],dep[M],num[M],ba[M],son[M],seg[M],rev[4*M];
int ma[4*M],sum[4*M],n,q,tot,xx,yy,summ,mamm;
char al[10];
vector<int> e[M];
void getsize(int u)
{
dep[u]=dep[ba[u]]+1;
size[u]=1;
int l=e[u].size();
for(int i=0;i<l;i++)
{
int to=e[u][i];
if(ba[u]==to) continue;
ba[to]=u;
getsize(to);
size[u]+=size[to];
if(!son[u]||size[to]>size[son[u]])
{
son[u]=to;
}
}
}
void dfs(int u,int fa)
{
if(son[u])
{
seg[son[u]]=++tot;
top[son[u]]=top[u];
rev[tot]=son[u];
dfs(son[u],u);
}
int l=e[u].size();
for(int i=0;i<l;i++)
{
int to=e[u][i];
if(top[to]) continue;
seg[to]=++tot;
top[to]=to;
rev[tot]=to;
dfs(to,u);
}
}
void build(int k,int l,int r)
{
if(l==r)
{
ma[k]=sum[k]=num[rev[l]];
return;
}
int mid=(l+r)>>1;
build(lc(k),l,mid);
build(rc(k),mid+1,r);
sum[k]=sum[lc(k)]+sum[rc(k)];
ma[k]=max(ma[lc(k)],ma[rc(k)]);
}
void change(int k,int x,int y,int pos,int p)
{
if(x>pos||y<pos) return;
if(x==y&&x==pos)
{
sum[k]=p;
ma[k]=p;
return ;
}
int mid=(x+y)>>1;
if(mid>=pos) change(lc(k),x,mid,pos,p);
if(mid+1<=pos)change(rc(k),mid+1,y,pos,p);
sum[k]=sum[lc(k)]+sum[rc(k)];
ma[k]=max(ma[lc(k)],ma[rc(k)]);
}
void getsm(int k,int x,int y,int l,int r)
{
if(x>r||y<l) return;
if(x>=l&&y<=r)
{
summ+=sum[k];
mamm=max(mamm,ma[k]);
return;
}
int mid=(x+y)>>1;
getsm(lc(k),x,mid,l,r);
getsm(rc(k),mid+1,y,l,r);
}
void ask(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]>dep[top[y]])
{
getsm(1,1,tot,seg[x],seg[top[x]]);
x=ba[top[x]];
}
else
{
getsm(1,1,tot,seg[y],seg[top[y]]);
y=ba[top[y]];
}
}
if(dep[x]>dep[y]) swap(x,y);
getsm(1,1,tot,seg[x],seg[y]);
}
signed main()
{
n=read();
for(int i=1;i<n;i++)
{
xx=read();yy=read();
e[xx].push_back(yy);e[yy].push_back(xx);
}
for(int i=1;i<=n;i++)
{
num[i]=read();
}
getsize(1);
tot=seg[1]=top[1]=rev[1]=1;
dfs(1,0);
build(1,1,tot);
q=read();
for(int i=1;i<=q;i++)
{
cin>>al;
xx=read();yy=read();
if(al[0]=='C')
{
change(1,1,tot,seg[xx],yy);
}
else
{
summ=0;mamm=-10000000;
ask(xx,yy);
if(al[1]=='M')
{
printf("%lld\n",mamm);
}
else
{
printf("%lld\n",summ);
}
}
}
}