#include <iostream>
#include <cstdio>
using namespace std;
const int NMAX = 100001;
struct tree{
int liber,st_liber,dr_liber,dim;
}arb[4 * NMAX];
int lf, rt;
void unite(tree &Res, tree f1, tree f2){
if(f1.liber == f1.dim && f2.liber == f2.dim){
Res.st_liber = Res.dr_liber = Res.liber = Res.dim = f1.dim + f2.dim;
return;
}
Res.st_liber = f1.st_liber;
if(f1.liber == f1.dim) /// tot intervalul tinut de f1 este liber
Res.st_liber = f1.liber + f2.st_liber;
Res.dr_liber = f2.dr_liber;
if(f2.liber == f2.dim) /// tot intervalul tinut de f2 este liber
Res.dr_liber =f1.dr_liber + f2.liber;
Res.liber = max(max(f1.liber, f2.liber), f1.dr_liber + f2.st_liber);
Res.dim = f1.dim + f2.dim;
}
void build(int nod, int st, int dr){
if(st == dr){
arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = arb[nod].dim = 1;
return;
}
int mij = (st+dr)/2;
build(2*nod, st, mij);
build(2*nod + 1, mij + 1, dr);
unite(arb[nod], arb[2*nod], arb[2*nod + 1]);
}
void ocupa_camere(int nod, int st, int dr){
//printf("ocupa : %d %d\n",st,dr);
if(dr < lf || st > rt)
return;
if(lf <= st && dr <= rt){
//printf("ocupa : inside ->>> %d %d\n",st,dr);
arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = 0;
}
if(st == dr){
arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = 0;
return;
}
int mij = (st+dr)/2;
ocupa_camere(2*nod, st, mij);
ocupa_camere(2*nod + 1, mij + 1, dr);
unite(arb[nod],arb[2*nod],arb[2*nod + 1]);
}
void elibereaza_camere(int nod, int st, int dr){
//printf("elibereaza : %d %d\n",st,dr);
if(dr < lf || st > rt)
return;
if(lf <= st && dr <= rt){
//printf("elibereaza : inside ->>> %d %d liber = %d\n",st,dr,dr-st+1);
arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = dr - st + 1;
}
if(st == dr){
arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = 1;
return;
}
int mij = (st+dr)/2;
elibereaza_camere(2*nod, st, mij);
elibereaza_camere(2*nod + 1, mij + 1, dr);
unite(arb[nod],arb[2*nod],arb[2*nod + 1]);
//printf("st = %d dr = %d liber = %d\n",st,dr,arb[nod].liber);
}
int main()
{
FILE *fin, *fout;
int n,p,i,m,op;
fin = fopen("hotel.in","r");
fout = fopen("hotel.out","w");
fscanf(fin,"%d %d",&n,&p);
build(1,1,n);
while(p--){
fscanf(fin,"%d",&op);
if(op == 3)
fprintf(fout,"%d\n",arb[1].liber);
else{
fscanf(fin,"%d %d",&i,&m);
lf = i, rt = i + m - 1;
if(op == 1)
ocupa_camere(1,1,n);
else
elibereaza_camere(1,1,n);
//printf("DONE\n");
}
}
fclose(fin);
fclose(fout);
return 0;
}