#include <cstdio>
#define N 131077
using namespace std;
int v1[4*N],x,y,v2[4*N],v3[4*N],n,m,op,i,cv2[4*N];
inline int mx(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 st,int dr,int op)
{
int c=((x+y)>>1);
if(cv2[nod]!=-1)
{
v1[2*nod]=cv2[nod]*(c-x+1);
v2[2*nod]=cv2[nod]*(c-x+1);
v3[2*nod]=cv2[nod]*(c-x+1);
v1[2*nod+1]=cv2[nod]*(y-c);
v2[2*nod+1]=cv2[nod]*(y-c);
v3[2*nod+1]=cv2[nod]*(y-c);
cv2[2*nod]=cv2[nod];
cv2[2*nod+1]=cv2[nod];
cv2[nod]=-1;
}
if(st<=x && y<=dr)
{
cv2[nod]=op;
v1[nod]=op*(y-x+1);
v2[nod]=op*(y-x+1);
v3[nod]=op*(y-x+1);
return;
}
if(c>=st) update(nod*2,x,c,st,dr,op);
if(c<dr) update(nod*2+1,c+1,y,st,dr,op);
v1[nod]=v1[2*nod]+v1[2*nod+1]*(v1[2*nod]==c-x+1);
v3[nod]=v3[2*nod+1]+v3[2*nod]*(v3[2*nod+1]==y-c);
v2[nod]=mx( v2[nod*2],v2[nod*2+1],v3[2*nod]+v1[2*nod+1] );
}
inline void build(int nod,int st,int dr,int poz)
{
if(st==dr) {v1[nod]=v2[nod]=v3[nod]=1;cv2[nod]=-1;return;}
int mij=(st+dr)>>1;
if(mij>=poz) build(nod*2,st,mij,poz);
else build(nod*2+1,mij+1,dr,poz);
v1[nod]=v1[2*nod]+v1[2*nod+1]*(v1[2*nod]==mij-st+1);
v3[nod]=v3[2*nod+1]+v3[2*nod]*(v3[2*nod+1]==dr-mij);
v2[nod]=mx(v2[nod*2],v2[nod*2+1],v3[2*nod]+v1[2*nod+1] );
cv2[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",&op);
if(op==3)
{
printf("%d\n",v2[1]);
}
else
{
scanf("%d%d",&x,&y);
y=x+y-1;
update(1,1,n,x,y,op-1);
}
}
return 0;
}