果然,还是,挂掉了。
只好抄教练的模板 QwQ
自己写的代码:
#include<stdio.h>
const int N=3e5+1;
int head[N],to[N],nex[N],w[N],tad=0;
inline void mkr(const int u,const int v){to[++tad]=v,nex[tad]=head[u],head[u]=tad;}
int siz[N],top[N],son[N],in[N],rev[N],dep[N],fa[N],tot=0;
int n;
const int MAX=(1u<<31)-1,MIN=(1u<<31);
void dfs1(const int u,const int Fa){
siz[u]=1;
fa[u]=Fa;
dep[u]=dep[Fa]+1;
for(register int i=head[u];i;i=nex[i]){
const int t=to[i];
if(t!=Fa){
dfs1(t,u);
siz[u]+=siz[t];
if(siz[son[u]]<siz[t])son[u]=t;
}
}
}
void dfs2(const int u,const int Fa){
if(son[u]){
in[son[u]]=++tot;
rev[tot]=son[u];
top[son[u]]=top[u];
dfs2(son[u],u);
}
for(register int i=head[u];i;i=nex[i]){
const int t=to[i];
if(t!=Fa&&t!=son[u]){
in[t]=++tot;
rev[tot]=t;
top[t]=t;
dfs2(t,u);
}
}
}
inline void init(){
dfs1(1,0);
in[1]=++tot;
rev[tot]=1;
top[1]=1;
dfs2(1,0);
}
inline void maxs(int &a,register const int b){a=(a>b)?a:b;}
inline int max(register const int a,register const int b){return (a>b)?a:b;}
inline void mins(int &a,register const int b){a=(a<b)?a:b;}
inline int min(register const int a,register const int b){return (a<b)?a:b;}
inline void swap(int &a,int &b){int t=a;a=b,b=t;}
struct __{
int val_max,val_sum;
};
class ___{
private:
__ tr[N<<2];
public:
void built(int k,int l,int r){
if(l==r){
tr[k].val_max=w[rev[l]];
tr[k].val_sum=w[rev[l]];
return;
}
int mid=(l+r)>>1;
built(k*2,l,mid);
built(k*2+1,mid+1,r);
tr[k].val_max=max(tr[k*2].val_max,tr[k*2+1].val_max);
tr[k].val_sum=tr[k*2].val_sum+tr[k*2+1].val_sum;
}
int get_sum(int k,int l,int r,int x,int y){
if(x<=l&&r<=y){
return tr[k].val_sum;
}
int mid=(l+r)>>1;
int Sum=0;
if(x<=mid){
Sum+=get_sum(k*2,l,mid,x,y);
}
if(y>mid){
Sum+=get_sum(k*2+1,mid+1,r,x,y);
}
return Sum;
}
int get_max(int k,int l,int r,int x,int y){
if(x<=l&&r<=y){
return tr[k].val_max;
}
int mid=(l+r)>>1;
int Max=MIN;
if(x<=mid){
maxs(Max,get_max(k*2,l,mid,x,y));
}
if(y>mid){
maxs(Max,get_max(k*2+1,mid+1,r,x,y));
}
return Max;
}
void change(int k,int l,int r,int x,int Val){
if(l==x&&x==r){
tr[k].val_max=Val;
tr[k].val_sum=Val;
return ;
}
int mid=(l+r)>>1;
if(x<=mid){
change(k*2,l,mid,x,Val);
}else{
change(k*2+1,mid+1,r,x,Val);
}
tr[k].val_max=max(tr[k*2].val_max,tr[k*2+1].val_max);
tr[k].val_sum=tr[k*2].val_sum+tr[k*2+1].val_sum;
}
};
___ ____;
inline int Get_max(int x,int y){
int Max=MIN;
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]<dep[fy]){
swap(x,y);
swap(fx,fy);
}
maxs(Max,____.get_max(1,1,n,in[fx],in[x]));
x=fa[fx],fx=top[x];
}
maxs(Max,____.get_max(1,1,n,min(in[x],in[y]),max(in[x],in[y])));
return Max;
}
inline int Get_sum(int x,int y){
int Sum=0;
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]<dep[fy]){
swap(x,y);
swap(fx,fy);
}
Sum+=____.get_sum(1,1,n,in[fx],in[x]);
x=fa[fx],fx=top[x];
}
Sum+=____.get_sum(1,1,n,min(in[x],in[y]),max(in[x],in[y]));
return Sum;
}
int l,b,f,fnn;
char klee[15],y;
int main(){
scanf("%d",&n);
for(register int i=1;i<n;i++){
scanf("%d%d",&l,&b);
mkr(l,b);
mkr(b,l);
}
init();
for(register int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
____.built(1,1,n);
scanf("%d",&f);
while(f--){
fnn=0;
y=getchar();
while(y!='Q'&&y!='C'){
y=getchar();
}
klee[fnn++]=y;
while(y>='A'&&y<='Z'){
y=getchar();
klee[fnn++]=y;
}
scanf("%d%d",&l,&b);
if(klee[1]=='M'){
printf("%d\n",Get_max(l,b));
}else if(klee[1]=='S'){
printf("%d\n",Get_sum(l,b));
}else{
____.change(1,1,n,l,b);
}
}
return 0;
}
哪位大佬帮帮忙~~(就是码风有亿些抽象)~~