#include <stdio.h>
#include <string.h>
using namespace std;
FILE *f,*g;
const long nmax=100005;
long n,m,val,i,j,a,b,x,st[3*nmax],dr[3*nmax],mij[3*nmax],maxim;
int cod;
void update(int nod, int ic, int sf)
{
long mi,nr;
if (ic==sf)
{
st[nod]=val;
dr[nod]=val;
mij[nod]=val;
}
else
{
mi=(ic+sf)/2;
if (x<=mi) update(2*nod,ic,mi);
else update(2*nod+1,mi+1,sf);
if (mij[2*nod]>=mij[2*nod+1]) mij[nod]=mij[2*nod];
else mij[nod]=mij[2*nod+1];
if (dr[2*nod]+st[2*nod+1]>mij[nod]) mij[nod]=dr[2*nod]+st[2*nod+1];
st[nod]=st[2*nod];
dr[nod]=dr[2*nod+1];
nr=mi-ic+1;
if (st[2*nod]==nr) st[nod]+=st[2*nod+1];
nr=sf-mi;
if (dr[2*nod+1]==nr) dr[nod]+=dr[2*nod];
}
}
void initialize(int nod, int ic, int sf)
{
long mi,nr;
if (ic==sf)
{
st[nod]=1;dr[nod]=1;mij[nod]=1;
}
else
{
mi=(ic+sf)/2;
initialize(2*nod,ic,mi);
initialize(2*nod+1,mi+1,sf);
if (mij[2*nod]>=mij[2*nod+1]) mij[nod]=mij[2*nod];
else mij[nod]=mij[2*nod+1];
if (dr[2*nod]+st[2*nod+1]>mij[nod]) mij[nod]=dr[2*nod]+st[2*nod+1];
st[nod]=st[2*nod];
dr[nod]=dr[2*nod+1];
nr=mi-ic+1;
if (st[2*nod]==nr) st[nod]+=st[2*nod+1];
nr=sf-mi;
if (dr[2*nod+1]==nr) dr[nod]+=dr[2*nod];
}
}
void solve()
{
memset(st,0,sizeof(st));
memset(dr,0,sizeof(dr));
memset(mij,0,sizeof(mij));
initialize(1,1,n);
for (i=1;i<=m;i++)
{
fscanf(f,"%d",&cod);
if (cod==3)
{
if (st[1]>dr[1]) maxim=st[1];
else maxim=dr[1];
if (mij[1]>maxim) maxim=mij[1];
fprintf(g,"%ld\n",maxim);
}
if (cod==1)
{
fscanf(f,"%ld%ld",&a,&b);
b=a+b-1;
for (j=a;j<=b;j++) {
x=j;val=0;
update(1,1,n);
}
}
if (cod==2)
{
fscanf(f,"%ld%ld",&a,&b);
b=a+b-1;
for (j=a;j<=b;j++) {
x=j;val=1;
update(1,1,n);
}
}
}
}
int main()
{
f=fopen("hotel.in","r");
g=fopen("hotel.out","w");
fscanf(f,"%ld%ld",&n,&m);
solve();
fclose(f);fclose(g);
return 0;
}