https://www.luogu.com.cn/record/194000429
#include <bits/stdc++.h>
using namespace std;
inline int read(){
int w=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9'){
w=w*10+(ch-'0');
ch=getchar();
}
return w*f;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=2e5+15;
struct Node{
int l,r,lm,rm,mx,sum,tag;
Node(){
lm=rm=mx=sum=tag=0;
}
};
int k;
struct SegmentTree{
Node tr[N<<2];
void build(int id,int l,int r){
tr[id].l=l,tr[id].r=r;
if(l==r) return ;
int mid = l+r>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
return ;
}
void pushdown(int id){
if(!tr[id].tag) return ;
int l = tr[id].l,r=tr[id].r,mid = l+r>>1;
tr[id<<1].lm=mid-l+1,tr[id<<1].rm=mid-l+1,tr[id<<1].mx=mid-l+1,tr[id<<1].sum=mid-l+1,tr[id<<1].tag=1;
tr[id<<1|1].lm=r-mid,tr[id<<1|1].rm=r-mid,tr[id<<1|1].mx=r-mid,tr[id<<1|1].sum=r-mid,tr[id<<1|1].tag=1;
tr[id].tag=0;
return ;
}
void update(Node &rt,Node &ls,Node &rs){
rt.lm=ls.lm;
if(ls.sum==ls.r-ls.l+1) rt.lm+=rs.lm;
rt.rm=rs.rm;
if(rs.sum==rs.r-rs.l+1) rt.rm+=ls.rm;
rt.mx=max(ls.rm+rs.lm,max(ls.mx,rs.mx));//very important
rt.sum=ls.sum+rs.sum;
return ;
}
void change1(int id,int x,int y,int l,int r){
if(x<=l&&r<=y){
tr[id].tag=1;
tr[id].lm=r-l+1,tr[id].rm=r-l+1,tr[id].mx=r-l+1,tr[id].sum=r-l+1;
return ;
}
pushdown(id);
int mid = l+r>>1;
if(x<=mid) change1(id<<1,x,y,l,mid);
if(y>mid) change1(id<<1|1,x,y,mid+1,r);
update(tr[id],tr[id<<1],tr[id<<1|1]);
return ;
}
void change2(int id,int x,int y,int l,int r){
if(k==0) return ;
if(x<=l&&r<=y&&k>=tr[id].sum){
k-=tr[id].sum;
tr[id].lm=tr[id].rm=tr[id].mx=tr[id].sum=0;
tr[id].tag=0;
return ;
}
pushdown(id);
int mid=l+r>>1;
if(k>0&&x<=mid) change2(id<<1,x,y,l,mid);
if(k>0&&y>mid) change2(id<<1|1,x,y,mid+1,r);
update(tr[id],tr[id<<1],tr[id<<1|1]);
return ;
}
int query1(int id,int x,int y,int l,int r){
if(x<=l&&r<=y){
return tr[id].sum;
}
pushdown(id);
int mid = l+r>>1,ans=0;
if(x<=mid) ans+=query1(id<<1,x,y,l,mid);
if(y>mid) ans+=query1(id<<1|1,x,y,mid+1,r);
return ans;
}
Node query2(int id,int x,int y,int l,int r){
if(x<=l&&r<=y){
return tr[id];
}
Node ret;
int mid = l + r >> 1;
if(l<=mid&&mid<r){
Node ls = query2(id<<1,x,y,l,mid),rs=query2(id<<1|1,x,y,mid+1,r);
update(ret,ls,rs);
}
else if (l<=mid){
return query2(id<<1,x,y,l,mid);
}
else if(r>mid){
return query2(id<<1|1,x,y,mid+1,r);
}
return ret;
}
}T;
int main(){
int n = read() , m=read();
T.build(1,1,n);
for(int i = 1 ; i<=m ; i++){
int op = read();
if(op==0){
int l = read() , r = read();
T.change1(1,l,r,1,n);
}
if(op==1){
int l0 = read() , r0 = read() , l1 = read() , r1 = read();
int sum = r0-l0+1 - T.query1(1,l0,r0,1,n);
T.change1(1,l0,r0,1,n);
k = sum ;
T.change2(1,l1,r1,1,n);
k = 0;
}
if(op==2){
int l = read() , r = read() ;
int ans = T.query2(1,l,r,1,n).mx;
write(ans);
putchar('\n');
}
}
return 0;
}