#include <cstdio>
#define N 100015
using namespace std;
int A[4*N],x,y,B[4*N],C[4*N],n,m,tip,i,cb[4*N];
inline int maxim(int x,int y,int z)
{
if(x>=y && x>=z) return x;
if(y>=x && y>=z) return y;
return z;
}
inline void Update(int nod,int x,int y,int lu,int ru,int tip)
{
int c=((x+y)>>1);
if(cb[nod]!=-1)
{
A[2*nod]=cb[nod]*(c-x+1);
B[2*nod]=cb[nod]*(c-x+1);
C[2*nod]=cb[nod]*(c-x+1);
A[2*nod+1]=cb[nod]*(y-c);
B[2*nod+1]=cb[nod]*(y-c);
C[2*nod+1]=cb[nod]*(y-c);
cb[2*nod]=cb[nod];
cb[2*nod+1]=cb[nod];
cb[nod]=-1;
}
if(lu<=x && y<=ru)
{
cb[nod]=tip;
A[nod]=tip*(y-x+1);
B[nod]=tip*(y-x+1);
C[nod]=tip*(y-x+1);
return;
}
if(c>=lu) Update(nod*2,x,c,lu,ru,tip);
if(c<ru) Update(nod*2+1,c+1,y,lu,ru,tip);
A[nod]= A[2*nod]+ A[2*nod+1]*(A[2*nod]==c-x+1);
C[nod]= C[2*nod+1]+ C[2*nod]*(C[2*nod+1]==y-c);
B[nod]=maxim( B[nod*2], B[nod*2+1], C[2*nod]+A[2*nod+1] );
}
inline void build(int nod,int x,int y,int poz)
{
if(x==y) {A[nod]=B[nod]=C[nod]=1;cb[nod]=-1;return;}
int c=((x+y)>>1);
if(c>=poz) build(nod*2,x,c,poz);
else build(nod*2+1,c+1,y,poz);
A[nod]= A[2*nod]+ A[2*nod+1]*(A[2*nod]==c-x+1);
C[nod]= C[2*nod+1]+ C[2*nod]*(C[2*nod+1]==y-c);
B[nod]=maxim( B[nod*2], B[nod*2+1], C[2*nod]+A[2*nod+1] );
cb[nod]=-1;
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
build(1,1,n,i);
for(i=1;i<=m;++i)
{
scanf("%d",&tip);
if(tip==3) printf("%d\n",B[1]);
else
{
scanf("%d%d",&x,&y);y=x+y-1;
Update(1,1,n,x,y, tip-1);
}
}
return 0;
}