#include <cstdio>
int t,n;
struct arbore{
int prefix,sufix,secvmax;
} arb[1<<18];
void initializ(int p, int st, int dr)
{
if(st==dr)
{
arb[p].prefix=arb[p].sufix=arb[p].secvmax=1;
return;
}
arb[p].prefix=arb[p].sufix=arb[p].secvmax=dr-st+1;
initializ(2*p,st,(st+dr)/2);
initializ(2*p+1,(st+dr)/2+1,dr);
}
int max(int a, int b)
{
return a>b ?a :b;
}
int max(int a, int b, int c)
{
int h=max(b,c);
return a> h ? a :h;
}
bool liber=0;
int stint, drint;
void ocup(int p,int st, int dr)
{
if(liber)
{
arb[p].prefix=arb[p].sufix=arb[p].secvmax=dr-st+1;
}
if(stint<=st && dr<=drint)
{
arb[p].prefix=arb[p].sufix=arb[p].secvmax=0;
return;
}
if(dr<stint || st>drint)
return;
if(arb[p].secvmax==dr-st+1 && liber==0)
{
liber=1;
ocup(2*p,st, (st+dr)/2);
ocup(2*p+1,(st+dr)/2+1, dr);
liber=0;
}
else
{
ocup(2*p,st, (st+dr)/2);
ocup(2*p+1,(st+dr)/2+1, dr);
}
arb[p].secvmax=max(arb[2*p].secvmax,arb[2*p+1].secvmax, arb[2*p].sufix+arb[2*p+1].prefix);
if(arb[2*p].prefix==(st+dr)/2-st+1)
arb[p].prefix=arb[2*p].prefix+arb[2*p+1].prefix;
else
arb[p].prefix=arb[2*p].prefix;
if(arb[2*p+1].sufix==dr-(st+dr)/2)
arb[p].sufix=arb[2*p].sufix+arb[2*p+1].sufix;
else
arb[p].sufix=arb[2*p+1].sufix;
}
void fill(int st, int dr)
{
stint=st;
drint=dr;
ocup(1,1,n);
}
bool plin=0;
void eliberez(int p, int st, int dr)
{
if(plin)
{
arb[p].prefix=arb[p].sufix=arb[p].secvmax=0;
}
if(stint<=st && dr<=drint)
{
arb[p].prefix=arb[p].sufix=arb[p].secvmax=dr-st+1;
return;
}
if(dr<stint || st>drint)
return;
if(arb[p].secvmax==dr-st+1 && plin==0)
{
plin=1;
eliberez(2*p,st, (st+dr)/2);
eliberez(2*p+1,(st+dr)/2+1, dr);
plin=0;
}
else
{
eliberez(2*p,st, (st+dr)/2);
eliberez(2*p+1,(st+dr)/2+1, dr);
}
arb[p].secvmax=max(arb[2*p].secvmax,arb[2*p+1].secvmax, arb[2*p].sufix+arb[2*p+1].prefix);
if(arb[2*p].prefix==(st+dr)/2-st+1)
arb[p].prefix=arb[2*p].prefix+arb[2*p+1].prefix;
else
arb[p].prefix=arb[2*p].prefix;
if(arb[2*p+1].sufix==dr-(st+dr)/2)
arb[p].sufix=arb[2*p].sufix+arb[2*p+1].sufix;
else
arb[p].sufix=arb[2*p+1].sufix;
}
void empty(int st, int dr)
{
stint=st;
drint=dr;
eliberez(1,1,n);
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&t);
//initializ(1,1,n);
arb[1].secvmax=arb[1].sufix=arb[1].prefix=n;
int var,membr,init;
for(int i=1; i<=t; i++)
{
scanf("%d",&var);
if(var==1)
{
scanf("%d%d",&init,&membr);
fill(init, init+membr-1);
}
if(var==2)
{
scanf("%d%d",&init,&membr);
empty(init,init+membr-1);
}
if(var==3)
{
printf("%d\n",arb[1].secvmax);
}
}
return 0;
}