#include<fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int MAXN = 300010;
int N, P, M, x, poz, a, b;
bool need_update[MAXN];
struct interval
{
int liber, ls, ld;
};
interval arb[MAXN];
inline int maxim(int a, int b)
{
if(a > b)
return a;
return b;
}
void ocupa(int p, int st, int dr)
{
arb[p].liber = arb[p].ls = arb[p].ld = 0;
}
void elibereaza(int p, int st, int dr)
{
arb[p].liber = arb[p].ls = arb[p].ld = dr-st+1;
}
void actualizare(int p, int st, int dr)
{
int fs = 2*p, fd = 2*p+1, mid = (st+dr)/2;
if(arb[fs].liber == mid-st+1)
arb[p].ls = arb[fs].liber + arb[fd].ls;
else
arb[p].ls = arb[fs].ls;
if(arb[fd].liber == dr-mid)
arb[p].ld = arb[fd].liber + arb[fs].ld;
else
arb[p].ld = arb[fd].ld;
}
void update2(int p, int st, int dr)
{
// se elibereaza camerele
if(a<=st && dr<=b)
{
arb[p].liber = dr - st + 1;
arb[p].ls = arb[p].liber;
arb[p].ld = arb[p].liber;
return;
}
int mid = (st + dr)/2;
if(arb[p].liber == 0)
{
ocupa(2*p, st, mid);
ocupa(2*p+1, mid+1, dr);
}
if(a <= mid)
update2(2*p, st, mid);
if(mid+1 <= b)
update2(2*p+1, mid+1, dr);
actualizare(p, st, dr);
int aux = maxim(arb[2*p].liber, arb[2*p+1].liber);
arb[p].liber = maxim(aux, arb[2*p].ld+arb[2*p+1].ls);
}
void update1(int p, int st, int dr)
{
// se ocupa camerele
if(a<=st && dr<=b)
{
arb[p].liber = 0;
arb[p].ls = 0;
arb[p].ld = 0;
return;
}
int mid = (st + dr)/2;
if(arb[p].liber == (dr-st+1))
{
elibereaza(2*p, st, mid);
elibereaza(2*p+1, mid+1, dr);
}
if(a <= mid)
update1(2*p, st, mid);
if(mid+1 <= b)
update1(2*p+1, mid+1, dr);
actualizare(p, st, dr);
int aux = maxim(arb[2*p].liber, arb[2*p+1].liber);
arb[p].liber = maxim(aux, arb[2*p].ld+arb[2*p+1].ls);
}
void afisare(int p, int st, int dr)
{
fout<<p<<" ["<<st<<","<<dr<<"] liber = " << arb[p].liber << " stanga = " << arb[p].ls << " dreapta = " << arb[p].ld << "\n";
if(st != dr)
{
int mid = (st + dr) / 2;
afisare(2*p, st, mid);
afisare(2*p+1, mid+1, dr);
}
}
int main()
{
int i, aux;
fin >> N >> P;
arb[1].liber = arb[1].ls = arb[1].ld = N;
for(i=0; i<P; ++i)
{
fin >> x;
if(x == 1)
{
fin >> poz >> M;
a = poz;
b = poz+M-1;
update1(1, 1, N);
}
else if(x == 2)
{
fin >> poz >> M;
a = poz;
b = poz+M-1;
update2(1, 1, N);
}
else
fout << arb[1].liber << "\n";
//afisare(1,1,N);
//fout<<"\n";
}
fin.close();
fout.close();
return 0;
}