#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define debug cout<<"DS"<<endl
int re(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void file(){
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
const int N = 2e5+10;
struct node{
int lmax,rmax,max,sum,siz,tag;
}t[2][N<<2];
int n,m;
void pushup(int p){
for(int i=0;i<=1;i++){
t[i][p].max=max(t[i][p<<1].max,max(t[i][p<<1|1].max,t[i][p<<1].rmax+t[i][p<<1|1].lmax));
t[i][p].lmax=t[i][p<<1].lmax==t[i][p<<1].siz?t[i][p<<1].siz+t[i][p<<1|1].lmax:t[i][p<<1].lmax;
t[i][p].rmax=t[i][p<<1|1].rmax==t[i][p<<1|1].siz?t[i][p<<1|1].siz+t[i][p<<1].rmax:t[i][p<<1|1].rmax;
t[i][p].sum=t[i][p<<1|1].sum+t[i][p<<1].sum;
}
}
void build(int p,int l,int r){
t[0][p].siz=t[1][p].siz=r-l+1;
if(l==r){
t[1][p].sum=t[1][p].lmax=t[1][p].rmax=t[1][p].max=1;
return;
}
int mid = l+r >> 1;
build(p<<1,l,mid),build(p<<1|1,mid+1,r);
pushup(p);
}
void upd(int p,int l,int r,int k){
t[k][p].tag=1;
t[k][p].lmax=t[k][p].rmax=t[k][p].max=t[k][p].sum=r-l+1;
t[k^1][p]={0,0,0,0,r-l+1,0};
}
void pushdown(int p,int l,int r){
for(int i=0;i<=1;i++){
if(t[i][p].tag){
int mid = l+r >> 1;
upd(p<<1,l,mid,i),upd(p<<1|1,mid+1,r,i);
t[i][p].tag=0;
}
}
}
void update(int p,int l,int r,int x,int y,int k){
if(l>=x&&r<=y){
upd(p,l,r,k);
return;
}
int mid = l+r >> 1;
pushdown(p,l,r);
if(x<=mid)update(p<<1,l,mid,x,y,k);
if(y>mid)update(p<<1|1,mid+1,r,x,y,k);
pushup(p);
}
int query(int p,int l,int r,int x,int y,int op){
if(l>=x&&r<=y){
return t[op][p].sum;
}
int res=0;
int mid = l+r >> 1;
pushdown(p,l,r);
if(x<=mid)res+=query(p<<1,l,mid,x,y,op);
if(y>mid)res+=query(p<<1|1,mid+1,r,x,y,op);
return res;
}
int find(int p,int l,int r,int x,int y,int k){
if(l==r)return l;
int mid = l+r >> 1;
pushdown(p,l,r);
int lsum=t[0][p<<1].sum;
if(lsum>=k)return find(p<<1,l,mid,x,y,k);
else return find(p<<1|1,mid+1,r,x,y,k-lsum);
}
int Query(int p,int l,int r,int x,int y){
if(l>=x&&r<=y){
return t[0][p].max;
}
int res=-1;
pushdown(p,l,r);
int mid = l+r >> 1;
if(x<=mid)res=max(Query(p<<1,l,mid,x,y),res);
if(y>mid)res=max(res,Query(p<<1|1,mid+1,r,x,y));
if(x<=mid&&y>mid)res=max(res,min(mid-x+1,t[0][p<<1].rmax)+min(y-mid,t[0][p<<1|1].lmax));
return res;
}
int main(){
n=re(),m=re();
build(1,1,n);
for(int i=1;i<=m;i++){
int op=re(),l=re(),r=re();
if(op==0){
update(1,1,n,l,r,0);
}
else if(op==1){
int L=re(),R=re();
int Sum=query(1,1,n,l,r,1);
if(Sum==0)continue;
update(1,1,n,l,r,0);
int S=query(1,1,n,L,R,0);
if(S==0)continue;
if(S<=Sum)update(1,1,n,L,R,1);
else{
int id=find(1,1,n,L,R,Sum);
update(1,1,n,L,id,1);
}
}
else{
cout<<Query(1,1,n,l,r)<<endl;
}
}
return 0;
}