#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m;
bool g=0;
struct o{
int sum,mx,lc,rc,tg,l,r;
}t[N<<3];
inline void pushup(int x,int l,int r){
t[x].sum=t[x<<1].sum+t[x<<1|1].sum;
t[x].mx=max(t[x<<1].mx,t[x<<1|1].mx);
t[x].lc=t[x<<1].lc,t[x].rc=t[x<<1|1].rc;
t[x].mx=max(t[x].mx,t[x<<1].rc+t[x<<1|1].lc);
int mid=(l+r)>>1;
if(t[x<<1].lc==mid-l+1)t[x].lc+=t[x<<1|1].lc;
if(t[x<<1|1].rc==r-mid)t[x].rc+=t[x<<1].rc;
}
inline void tp(int x,int l,int r,int val){
t[x].sum=val?r-l+1:0;
t[x].lc=t[x].rc=val?0:r-l+1;
t[x].mx=val?0:r-l+1;
t[x].tg=val;
}
inline void pushdown(int x,int l,int r){
if(t[x].tg!=-1){
int mid=(l+r)>>1;
tp(x<<1,l,mid,t[x].tg);
tp(x<<1|1,mid+1,r,t[x].tg);
t[x].tg=-1;
}
return;
}
inline void build(int x,int l,int r){
t[x].l=l,t[x].r=r;
if(l==r){
t[x].sum=1;
t[x].lc=t[x].rc=t[x].mx=0;
t[x].tg=-1;
return;
}
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x,l,r);
t[x].tg=-1;
return;
}
inline int update(int x,int l,int r,int ql,int qr){
if(l>qr||r<ql)return 0;
pushdown(x,l,r);
if(l>=ql&&r<=qr){
int k=t[x].sum;
tp(x,l,r,0);
return k;
}
int mid=(l+r)>>1;
int sum=update(x<<1,l,mid,ql,qr)+update(x<<1|1,mid+1,r,ql,qr);
pushup(x,l,r);
return sum;
}
inline void change(int x,int l,int r,int ql,int qr,int k){
if(!k||l>qr||r<ql)return;
pushdown(x,l,r);
if(l>=ql&&r<=qr&&r-l+1-t[x].sum<=k){
tp(x,l,r,1);
return;
}
int mid=(l+r)>>1;
if(mid>=ql){
int g=k-(mid-l+1-t[x<<1].sum);
change(x<<1,l,mid,ql,qr,k);
if(g>0)change(x<<1|1,mid+1,r,ql,qr,g);
}else change(x<<1|1,mid+1,r,ql,qr,k);
pushup(x,l,r);
}
inline int ask(int x,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr)return t[x].mx;
pushdown(x,l,r);
int mid=(l+r)>>1;
if(mid<ql)return ask(x<<1|1,mid+1,r,ql,qr);
if(mid>=qr)return ask(x<<1,l,mid,ql,qr);
return max(max(ask(x<<1,l,mid,ql,qr),ask(x<<1|1,mid+1,r,ql,qr)),min(t[x<<1].rc,mid+1-ql)+min(t[x<<1|1].lc,qr-mid));
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
build(1,1,n);
for(int i=1;i<=m;i++){
int op,l,r;
cin>>op>>l>>r;
if(op==0)update(1,1,n,l,r);
else if(op==1){
int k=update(1,1,n,l,r);
cin>>l>>r;
change(1,1,n,l,r,k);
}else{
cout<<ask(1,1,n,l,r)<<'\n';
}
}
return 0;
}