#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
FILE *f,*g;
struct arbint
{
int down, sol, lf, rt;
}v[200002];
int a,b,n,m,val;
void read()
{
fscanf(f,"%d %d",&n,&m);
}
int maxim(int a, int b, int c)
{
if(a>b)
return a>c ? a:c;
else
return b>c ? b:c;
}
void update(int node, int st, int dr)
{
if(st>=a && dr<=b)
{
if(val==1)
v[node].lf=v[node].rt=v[node].sol=0;
else
v[node].lf=v[node].rt=v[node].sol=dr-st+1;
v[node].down=1;
return;
}
int mij=(st+dr)/2;
if(v[node].down==1)
{
if(v[node].sol==0)
{
v[2*node].sol=v[2*node].lf=v[2*node].rt=0;
v[2*node+1].sol=v[2*node+1].lf=v[2*node+1].rt=0;
}
else
{
v[2*node].sol=v[2*node].lf=v[2*node].rt=mij-st+1;
v[2*node+1].sol=v[2*node+1].lf=v[2*node+1].rt=dr=mij;
}
v[2*node].down=v[2*node+1].down=1;
v[node].down=0;
}
if(a<=mij)
update(2*node, st, mij);
if(b>mij)
update(2*node+1, mij+1, dr);
v[node].sol=maxim(v[2*node].sol, v[2*node+1].sol, v[2*node].rt+v[2*node+1].lf);
if(v[2*node].lf==mij-st+1)
v[node].lf=v[2*node].lf+v[2*node+1].lf;
else
v[node].lf=v[2*node].lf;
if(v[2*node+1].rt==dr-mij)
v[node].rt=v[2*node].rt+v[2*node+1].rt;
else
v[node].rt=v[2*node+1].rt;
}
void actual(int node, int st, int dr)
{
if(node>3*n)
return;
v[node].sol=v[node].lf=v[node].rt=dr-st+1;
int mij=(st+dr)/2;
actual(2*node, st, mij);
actual(2*node+1,mij+1, dr);
}
void solve()
{
actual(1,1,n);
for(int i=1; i<=m; i++)
{
fscanf(f,"%d",&val);
if(val==1)
{
fscanf(f,"%d %d",&a,&b);
b=a+b-1;
update(1,1,n);
}
else if(val==2)
{
fscanf(f,"%d %d",&a,&b);
b=a+b-1;
update(1,1,n);
}
else
fprintf(g,"%d\n",v[1].sol);
}
}
int main()
{
f=fopen("hotel.in","r");
g=fopen("hotel.out","w");
read();
solve();
//write();
fclose(f);
fclose(g);
return 0;
}