求hack wa20
查看原帖
求hack wa20
776873
da17_楼主2024/7/10 16:33

自己造了几组小样例,都对了

#include <iostream>
#define lc(x) son[x][0]
#define rc(x) son[x][1]
#define rnk(x) (siz[son[x][0]]+1)
#define int long long
using namespace std;
const int N=5e5+5,inf=1ll<<60;
int n,m,rt,rtl,rtr,tot,val[N],mx[N],son[N][2],siz[N],pri[N],tg[N],add[N];
inline int create(){ return ++tot,siz[tot]=1,pri[tot]=rand(),mx[tot]=-inf,tot; }
int push_up(int x){ siz[x]=siz[lc(x)]+siz[rc(x)]+1,mx[x]=val[x]; if(lc(x)) mx[x]=max(mx[x],mx[lc(x)]); if(rc(x)) mx[x]=max(mx[x],mx[rc(x)]); return x; }
void push_down(int x){ if(tg[x]){ swap(lc(x),rc(x));if(lc(x))tg[lc(x)]^=1;if(rc(x))tg[rc(x)]^=1;tg[x]=0; } if(add[x]){ int &p=add[x]; val[x]+=p,mx[x]+=p;if(lc(x))add[lc(x)]+=p;if(rc(x))add[rc(x)]+=p;p=0; } }
void split(int x,int &l,int &r,int k){
	if(!x) return l=r=0,void(); push_down(x);
	if(rnk(x)<=k) l=x,split(rc(x),rc(x),r,k-rnk(x));
	else r=x,split(lc(x),l,lc(x),k); push_up(x);
}
int merge(int l,int r){ if(!l||!r) return l|r;
	push_down(l),push_down(r); if(pri[l]<pri[r])
	return rc(l)=merge(rc(l),r),push_up(l);
	return lc(r)=merge(l,lc(r)),push_up(r);
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		rt=merge(rt,create());
	for(int i=1;i<=m;i++){
		int op,l,r,v,p; scanf("%lld%lld%lld",&op,&l,&r),
		split(rt,rtl,rtr,r),split(rtl,rtl,p,l-1);
		if(op==1) scanf("%lld",&v),add[p]+=v; else if(op==2) tg[p]^=1;
		else printf("%lld\n",mx[p]); rt=merge(merge(rtl,p),rtr);
	} return 0;
}
2024/7/10 16:33
加载中...