#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f,*g;
struct cp{int lst,ldr,lint; } H[250000];
int x,y,n,p,z,i;
void init(int nod, int st, int dr)
{
H[nod].lst=H[nod].ldr=H[nod].lint=dr-st+1;
if (st!=dr)
{
int m=(st+dr)/2;
init(nod*2,st,m);
init(nod*2+1,m+1,dr);
}
}
void update(int nod, int st, int dr , bool ok )
{
if (ok==true)
{
if (x<=st && dr<=y)
{
H[nod].lint=H[nod].lst=H[nod].ldr=0;
return ;
}
int m=(st+dr)/2;
if (x<=m)
update(nod*2,st,m,ok);
if (y>m)
update(nod*2+1,m+1,dr,ok);
if (H[nod*2].lst==m-st+1)
H[nod].lst=H[nod*2].lst+H[nod*2+1].lst;
else
H[nod].lst=H[nod*2].lst;
if (H[nod*2+1].ldr==dr-m)
H[nod].ldr=H[nod*2].ldr+H[nod*2+1].ldr;
else
H[nod].ldr=H[nod*2+1].ldr;
H[nod].lint=max(H[2*nod].lint,H[2*nod+1].lint);
H[nod].lint=max(H[nod].lint,H[2*nod].ldr+H[2*nod+1].lst);
}
else
{
if (x<=st && dr<=y)
{
H[nod].lst=H[nod].ldr=H[nod].lint=dr-st+1;
return;
}
int m=(st+dr)/2;
if (x<=m)
update(nod*2,st,m,ok);
if (y>m)
update(nod*2+1,m+1,dr,ok);
if (H[nod*2].lst==m-st+1)
H[nod].lst=H[nod*2].lst+H[nod*2+1].lst;
else
H[nod].lst=H[nod*2].lst;
if (H[nod*2+1].ldr==dr-m)
H[nod].ldr=H[nod*2].ldr+H[nod*2+1].ldr;
else
H[nod].ldr=H[nod*2+1].ldr;
H[nod].lint=max(H[2*nod].lint,H[2*nod+1].lint);
H[nod].lint=max(H[nod].lint,H[2*nod].ldr+H[2*nod+1].lst);
}
}
void read()
{
f=fopen("hotel.in","r");
g=fopen("hotel.out","w");
fscanf(f,"%d%d",&n,&p);
init(1,1,n);
for (i=1;i<=p;i++)
{
fscanf(f,"%d",&z);
switch (z)
{
case 1 :
{
fscanf(f,"%d%d",&x,&y);
y=x+y-1;
update(1,1,n,true);
break;
}
case 2 :
{
fscanf(f,"%d%d",&x,&y);
y=x+y-1;
update(1,1,n,false);
break;
}
case 3 :
{
fprintf(g,"%d\n",H[1].lint);
}
}
}
}
int main()
{
read();
fclose(g);
return 0;
}