#include<stdio.h>
int n,m,i,j,a,b;
struct ai{int l,r,mm;}v[ 400010 ];
int max(int a,int b,int c)
{if(a>=b && a>=c)return a;
if(b>=a && b>=c )return b;
if(c>=a && c>=b)return c;
}
void insert(int a,int b,int p,int u,int nod){
int m = (p+u)>>1;
int f1 = nod<<1,f2 = f1+1;
if(a<=p && u<=b)
{v[nod].l = v[nod].r = u-p+1;
v[nod].mm = u-p+1;
return ;
}
else
if(a>u || b < p)
return;
else
{if(v[nod].l+p-1 >= m)
v[f1].l = v[f1].r = v[f1].mm = m-p+1;
if(v[nod].mm == 0)
v[f1].mm = v[f1].l = v[f1].r = 0;
insert(a,b,p,m,f1);
if( v[nod].r >=u- m )
v[f2].l = v[f2].r = v[f2].mm = u-m;
if(v[nod].mm == 0 )
v[f2].mm = v[f2].l = v[f2].r = 0;
insert(a,b,m+1,u,f2);
if(v[f1].l == m-p+1)
v[nod].l = v[f1].l+v[f2].l;
else
v[nod].l = v[f1].l;
if(v[f2].r == u-m)
v[nod].r = v[f1].r+v[f2].r;
else
v[nod].r = v[f2].r;
v[nod].mm = max(v[nod].l,v[nod].r,v[f1].r+v[f2].l);
v[nod].mm = max(v[nod].mm,v[f1].mm,v[f2].mm);
}
}
void rem(int a,int b,int p,int u,int nod){
int m = (p+u)>>1;
int f1 = nod<<1,f2 = f1+1;
if(a <= p && u<=b)
{v[nod].l = v[nod].r = v[nod].mm = 0;
return;
}
else
if(a>u || b < p)
return;
else
{if(v[nod].l+p-1 >= m)
v[f1].l = v[f1].r = v[f1].mm = m-p+1;
if(v[nod].mm == 0)
v[f1].mm = v[f1].l = v[f1].r = 0;
rem(a,b,p,m,f1);
if( v[nod].r >=u- m )
v[f2].l = v[f2].r = v[f2].mm = u-m;
if(v[nod].mm == 0 )
v[f2].mm = v[f2].l = v[f2].r = 0;
rem(a,b,m+1,u,f2);
if(v[f1].l == m-p+1)
v[nod].l = v[f1].l+v[f2].l;
else
v[nod].l = v[f1].l;
if(v[f2].r == u-m)
v[nod].r = v[f1].r+v[f2].r;
else
v[nod].r = v[f2].r;
v[nod].mm = max(v[nod].l,v[nod].r,v[f1].r+v[f2].l);
v[nod].mm = max(v[nod].mm,v[f1].mm,v[f2].mm);
}
}
void citire(){
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d %d",&n,&m);
int i,a,b,c;
v[1].l = v[1].r = v[1].mm = n;
for(i = 1 ; i<=m;i++)
{scanf("%d",&a);
if(a == 3)
{printf("%d\n",v[1].mm);
continue;}
scanf("%d %d",&b,&c);
if(a==1){
c = b+c-1;
rem(b,c,1,n,1);
}
else
{c = b+c-1;
insert(b,c,1,n,1);}
}
}
int main(){
citire();
return 0;}