#include<cstdio>
inline int input(){
int x=0,c=getchar();
while(c>57||c<48)c=getchar();
while(c>47&&c<58)x=x*10+c-48,c=getchar();
return x;
}
const int N=420000;
int n,m,l,r;
int c0[N],sz[N],lc[N],rc[N],f1[N],f0[N],ls[N],rs[N],ms[N],p=1,ans=0,pv,ptr;
inline int max(int a,int b){return a>b?a:b;}
inline void maxs(int&a,int b){if(a<b)a=b;}
int build(int L,int R){
int w=p++;
if(L<R){
int M=L+R>>1;
lc[w]=build(L,M);
rc[w]=build(M+1,R);
sz[w]=sz[lc[w]]+sz[rc[w]];
}else sz[w]=1;
return w;
}
inline void tag1(int w){
if(!w)return;
f1[w]=1;f0[w]=0;
c0[w]=ls[w]=rs[w]=ms[w]=0;
}
inline void tag0(int w){
if(!w)return;
f1[w]=0;f0[w]=1;
c0[w]=ls[w]=rs[w]=ms[w]=sz[w];
}
inline void up(int w){
int l=lc[w],r=rc[w];
ms[w]=max(ms[l],ms[r]);
maxs(ms[w],rs[l]+ls[r]);
ls[w]=ls[l];
rs[w]=rs[r];
if(ls[l]==sz[l])maxs(ls[w],ls[l]+ls[r]);
if(rs[r]==sz[r])maxs(rs[w],rs[l]+rs[r]);
c0[w]=c0[l]+c0[r];
sz[w]=sz[l]+sz[r];
}
inline void dwn(int w){
if(f1[w]){
f1[w]=0;
tag1(lc[w]);tag1(rc[w]);
}
if(f0[w]){
f0[w]=0;
tag0(lc[w]);tag0(rc[w]);
}
}
void set0(int w=1,int L=1,int R=n){
if(l<=L&&R<=r){
tag0(w);
return;
}
dwn(w);
int M=L+R>>1;
if(l<=M)set0(lc[w],L,M);
if(r>M)set0(rc[w],M+1,R);
up(w);
}
void get1(int w=1,int L=1,int R=n){
if(l<=L&&R<=r){
ans+=sz[w]-c0[w];
return;
}
dwn(w);
int M=L+R>>1;
if(l<=M)get1(lc[w],L,M);
if(r>M)get1(rc[w],M+1,R);
}
void set1(int w=1,int L=1,int R=n){
if(!ans)return;
if(l<=L&&R<=r&&c0[w]<=ans){
ans-=c0[w];
tag1(w);
return;
}
dwn(w);
int M=L+R>>1;
if(l<=M)set1(lc[w],L,M);
if(r>M)set1(rc[w],M+1,R);
up(w);
}
void query(int w=1,int L=1,int R=n){
if(l<=L&&R<=r){
if(pv){
lc[ptr]=pv;rc[ptr]=w;
up(ptr);
pv=ptr++;
}else pv=w;
return;
}
dwn(w);
int M=L+R>>1;
if(l<=M)query(lc[w],L,M);
if(r>M)query(rc[w],M+1,R);
}
int main(){
n=input();m=input();
build(1,n);
while(m--){
int op=input();
l=input(),r=input();
if(op==0){
set0();
}else if(op==1){
ans=0;
get1();
set0();
l=input(),r=input();
set1();
}else{
pv=0,ptr=p;
query();
printf("%d\n",ms[pv]);
}
}
return 0;
}