RT, WA + TLE
#include<bits/stdc++.h>
using namespace std;
inline bool id(const char ch) {
return ch>='0'&&ch<='9';
}
inline int read(void) {
int s=0,f=0;
char ch=getchar();
while(!id(ch)) f=(ch=='-'),ch=getchar();
while(id(ch)) s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return f?-s:s;
}
const int MAXN=200000+10;
struct Tree {
int tag,sum,lmax,rmax,ans,l,r;
}tr[MAXN<<2];
int n,m;
inline int ALL_EMPTY(const Tree A) {
return A.r-A.l+1==A.sum;
}
inline Tree merge(const Tree A,const Tree B) {
return Tree{0,A.sum+B.sum,max(A.lmax,ALL_EMPTY(A)*(A.r-A.l+1+B.lmax)),max(B.rmax,ALL_EMPTY(B)*(B.r-B.l+1+A.rmax)),max(max(A.ans,B.ans),A.rmax+B.lmax),A.l,B.r};
}
/*
tag: 1->empty all 2->fill all
*/
inline void push_down(const int k,const int l,const int r) {
if(tr[k].tag==1) {
int mid=l+r>>1;
tr[k<<1]=Tree{1,mid-l+1,mid-l+1,mid-l+1,mid-l+1,l,mid},tr[k<<1|1]=Tree{1,r-mid,r-mid,r-mid,r-mid,mid+1,r};
tr[k].tag=0;
return;
}
if(tr[k].tag==2) {
int mid=l+r>>1;
tr[k<<1]=Tree{2,0,0,0,0,l,mid},tr[k<<1|1]=Tree{2,0,0,0,0,mid+1,r};
tr[k].tag=0;
return;
}
}
void update(const int k,const int l,const int r,const int x,const int y,const int val) {
if(x<=l&&r<=y) {
tr[k]=Tree{val,(2-val)*(r-l+1),(2-val)*(r-l+1),(2-val)*(r-l+1),(2-val)*(r-l+1),l,r};
return;
}
push_down(k,l,r);
int mid=l+r>>1;
if(x<=mid) update(k<<1,l,mid,x,y,val);
if(y>mid) update(k<<1|1,mid+1,r,x,y,val);
tr[k]=merge(tr[k<<1],tr[k<<1|1]);
return;
}
Tree query(const int k,const int l,const int r,const int x,const int y) {
if(x<=l&&r<=y) return tr[k];
push_down(k,l,r);
int mid=l+r>>1;
if(x<=mid&&y>mid) return merge(query(k<<1,l,mid,x,y),query(k<<1|1,mid+1,r,x,y));
if(x<=mid) return query(k<<1,l,mid,x,y);
return query(k<<1|1,mid+1,r,x,y);
}
int sum(const int k,const int l,const int r,const int x,const int y) {
if(x<=l&&r<=y) return tr[k].sum;
push_down(k,l,r);
int mid=l+r>>1,S=0;
if(x<=mid) S+=sum(k<<1,l,mid,x,y);
if(y>mid) S+=sum(k<<1|1,mid+1,r,x,y);
return S;
}
int bin_search(const int x,const int v) {
int l=x,r=n,ans=r;
while(l<=r) {
int mid=l+r>>1;
if(sum(1,1,n,x,mid)<=v) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int main() {
n=read(),m=read();
update(1,1,n,1,n,2);
for(int i=1,op,l,r,L,R;i<=m;i++) {
op=read(),l=read(),r=read();
if(op==0) update(1,1,n,l,r,1);
if(op==1) {int s=r-l+1-sum(1,1,n,l,r);update(1,1,n,l,r,1),L=read(),R=read(),update(1,1,n,L,min(R,bin_search(L,s)),2);}
if(op==2) printf("%d\n",query(1,1,n,l,r).ans);
}
return 0;
}