25分求调
查看原帖
25分求调
752318
Liuyc07楼主2024/1/13 15:16
#include<bits/stdc++.h>
#define ls (u<<1)
#define rs ((u<<1)|1)
#define mid ((tr[u].l+tr[u].r)>>1)
using namespace std;

const int N=2e5+10;

int n,m;
struct Info{
	int l,r,tag,len;
	int sum,pre,suf,ms;
}tr[N<<2];

void pushup(int u){
	auto &T=tr[u],L=tr[ls],R=tr[rs];
	T.sum=L.sum+R.sum;
	T.pre=(L.sum? L.pre:L.len+R.pre);
	T.suf=(R.sum? R.suf:R.len+L.suf);
	T.ms=max(max(L.ms,R.ms),L.suf+R.pre);	
}

void update(int u,int k){
	auto &T=tr[u];
	if(!k){
		T.ms=T.pre=T.suf=T.len;
		T.tag=0; T.sum=0;
	}
	else{
		T.ms=T.pre=T.suf=0;
		T.sum=T.len; T.tag=1;
	}
}

void pushdown(int u){
	auto &T=tr[u];
	if(~T.tag){
		update(ls,T.tag); update(rs,T.tag);
		T.tag=-1;
	}
}

void build(int u,int l,int r){
	tr[u]={l,r,-1,r-l+1,1,0,0,0};
	if(l==r){ 
		return;
	}
	build(ls,l,mid); build(rs,mid+1,r);
	pushup(u);
}

void modify(int u,int l,int r,int k){
	if(tr[u].l>=l and tr[u].r<=r){
		update(u,k);
		return;
	}
	pushdown(u);
	if(l<=mid) modify(ls,l,r,k);
	if(r>mid) modify(rs,l,r,k);
	pushup(u);
}

int q1(int u,int l,int r){
	if(tr[u].l>r or tr[u].r<l) return 0;
	if(tr[u].l>=l and tr[u].r<=r){
		return tr[u].sum;
	}
	pushdown(u);
	return q1(ls,l,r)+q1(rs,l,r);
}

int q0(int u,int l,int r){
	if(tr[u].l>r or tr[u].r<l) return 0;
	if(tr[u].l>=l and tr[u].r<=r){
		return tr[u].len-tr[u].sum;
	}
	pushdown(u);
	return q0(ls,l,r)+q0(rs,l,r);
}

Info query(int u,int l,int r){
	if(tr[u].l>=l and tr[u].r<=r){
		return tr[u];
	}	
	pushdown(u);
	Info T,L,R;
	if(l<=mid) L=query(ls,l,r);
	if(r>mid) R=query(rs,l,r);
	T.sum=L.sum+R.sum;
	T.pre=(L.sum? L.pre:L.len+R.pre);
	T.suf=(R.sum? R.suf:R.len+L.suf);
	T.ms=max(max(L.ms,R.ms),L.suf+R.pre);
	return T;
}

void work(){
	int l0,r0,l1,r1;
	scanf("%d%d%d%d",&l0,&r0,&l1,&r1);
	int cnt=q1(1,l0,r0);
	if(cnt==0) return;
	modify(1,l0,r0,0);
	int l=l1,r=r1;
	while(l<r){
		int M=(l+r)>>1;
		if(q0(1,l1,M)<cnt) l=M+1;
		else r=M;
	}
	modify(1,l1,l,1);
}

int main(){
	scanf("%d%d",&n,&m);
	build(1,1,n);
	while(m--){
		int op,l,r;
		scanf("%d",&op);
		if(op==0){
			scanf("%d%d",&l,&r);
			modify(1,l,r,0);
		}
		if(op==2){
			scanf("%d%d",&l,&r);
			printf("%d\n",query(1,l,r).ms);
		}
		if(op==1) work();
	}
	return 0;
}
2024/1/13 15:16
加载中...