#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define int long long
using namespace std;
const int N=200009;
int mn(int a,int b){return a<b?a:b;}
int mx(int a,int b){return a>b?a:b;}
int n,m,lim;
int sum[N<<2],tag[N<<2],sumz[N<<2],sumy[N<<2],sumzd[N<<2];
struct node{int mxz;int mxy;int mxx;};
inline int read()
{
int s=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
return f*s;
}
void pushup(int t,int l,int r){
sum[t]=sum[t*2]+sum[t*2+1];
int mid=(l+r)>>1;
sumz[t]=sumz[t*2];
if(sumzd[t*2]==l-mid+1) sumz[t]=mx(sumz[t],sumzd[t*2]+sumz[t*2+1]);
sumy[t]=sumy[t*2+1];
if(sumzd[t*2+1]==r-mid) sumy[t]=mx(sumy[t],sumzd[t*2+1]+sumy[t*2]);
sumzd[t]=mx(mx(sumzd[t*2],sumzd[t*2+1]),sumy[t*2]+sumz[t*2+1]);
}
void build(int t,int tl,int tr){
if(tl==tr) {sum[t]=1;sumz[t]=sumy[t]=sumzd[t]=0;return ;}
int mid=(tl+tr)>>1;
build(t*2,tl,mid);build(t*2+1,mid+1,tr);
pushup(t,tl,tr);
}
void pushdown(int t,int tl,int tr){
if(tag[t]==0) return ;
if(tag[t]==-1) tag[t]=0;
int mid=(tl+tr)>>1;
sum[t*2]=(mid-tl+1)*tag[t];
sumz[t*2]=sumy[t*2]=sumzd[t*2]=(tag[t])?0:(mid-tl+1);
sum[t*2+1]=(tr-mid)*tag[t];
sumz[t*2+1]=sumy[t*2+1]=sumzd[t*2+1]=(tag[t])?0:(tr-mid);
tag[t*2]=(tag[t]==0)?-1:tag[t];tag[t*2+1]=(tag[t]==0)?-1:tag[t];
tag[t]=0;
}
void update(int t,int tl,int tr,int l,int r,int z){
if(lim<=0) return ;
if(l<=tl&&tr<=r&&tr-tl+1-sum[t]<=lim){
lim-=(tr-tl+1-sum[t]);
sum[t]=(tr-tl+1)*z;tag[t]=(z==0)?-1:z;
sumz[t]=sumy[t]=sumzd[t]=(z)?0:tr-tl+1;
return ;
}
pushdown(t,tl,tr);
int mid=(tl+tr)>>1;
if(l<=mid)update(t*2,tl,mid,l,r,z);
if(r>mid) update(t*2+1,mid+1,tr,l,r,z);
pushup(t,tl,tr);
}
node query(int t,int tl,int tr,int l,int r)
{
if(l<=tl&&tr<=r) {return (node){sumz[t],sumy[t],sumzd[t]};}
pushdown(t,tl,tr);
int mid=(tl+tr)>>1,f1=0,f2=0;
node L,R;
if(l<=mid) {f1=1,L=query(t*2,tl,mid,l,r);}
if(r>mid) {f2=1;R=query(t*2+1,mid+1,tr,l,r);}
if(f1==0&&f2==1)return R;
if(f1==1&&f2==0)return L;
node tmp;
tmp.mxz=L.mxz;if(L.mxx==l-mid+1) tmp.mxz=mx(tmp.mxz,L.mxx+R.mxz);
tmp.mxy=R.mxy;if(R.mxx==r-mid) tmp.mxy=mx(tmp.mxy,R.mxx+L.mxy);
tmp.mxx=(mx(L.mxx,R.mxx),L.mxy+R.mxz);
return tmp;
}
int querysum(int t,int tl,int tr,int l,int r)
{
if(l<=tl&&tr<=r) {return sum[t];}
pushdown(t,tl,tr);
int ans=0,mid=(tl+tr)>>1;
if(l<=mid) ans+=querysum(t*2,tl,mid,l,r);
if(r>mid) ans+=querysum(t*2+1,mid+1,tr,l,r);
return ans;
}
signed main()
{
n=read();m=read();build(1,1,n);
for(int ty,l1,r1,l2,r2,i=1;i<=m;i++)
{
ty=read();
if(ty==0) l1=read(),r1=read(),lim=N,update(1,1,n,l1,r1,0);
if(ty==1)
{
l1=read(),r1=read(),l2=read(),r2=read();
int tt=querysum(1,1,n,l1,r1);
lim=N;update(1,1,n,l1,r1,0);
lim=tt;update(1,1,n,l2,r2,1);
}
if(ty==2) l1=read(),r1=read(),printf("%lld\n",query(1,1,n,l1,r1).mxx);
}
return 0;
}