#include <bits/stdc++.h>
using namespace std;
const int N=10000000;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n, p, i, m, c, poz;
struct nod
{
int mx, st, dr;
} a[N];
inline int maxim(int a, int b)
{
if(a > b)
return a;
return b;
}
void adauga(int poz, int l, int r, int p, int q)
{
int k = r - l + 1, mid = (r + l) / 2;
if(p <= l && r <= q)
{
a[poz].st = 0;
a[poz].dr = 0;
a[poz].mx = 0;
return;
}
if(a[poz].st == k && a[poz].dr == k)
{
a[2*poz].st = a[2*poz].mx = a[2*poz].dr = mid - l + 1;
a[2*poz+1].st = a[2*poz+1].mx = a[2*poz+1].dr = r - mid;
}
if(p <= mid)
adauga(2 * poz, l, mid, p, q);
if(mid < q)
adauga(2 * poz + 1, mid + 1, r, p, q);
if(a[2*poz].st == mid - l + 1)
a[poz].st = a[2*poz].st + a[2*poz+1].st;
else
a[poz].st = a[2*poz].st;
if(a[2*poz+1].dr == r - mid)
a[poz].dr = a[2*poz+1].dr + a[2*poz].dr;
else
a[poz].dr = a[2*poz+1].dr;
a[poz].mx = maxim(maxim(a[2*poz].mx, a[2*poz+1].mx), a[2*poz].dr + a[2*poz+1].st);
}
void elibereaza(int poz,int l, int r, int p,int q)
{
int k = r - l + 1, mid = (r + l) / 2;
if(p <= l && r <= q)
{
a[poz].st = k;
a[poz].dr = k;
a[poz].mx = k;
return;
}
if(a[poz].mx == 0)
{
a[2*poz].st = a[2*poz].mx = a[2*poz].dr = 0;
a[2*poz+1].st = a[2*poz+1].mx = a[2*poz+1].dr = 0;
}
if(p <= mid)
elibereaza (2 * poz, l, mid, p, q);
if(mid < q)
elibereaza (2 * poz+1, mid+1, r, p, q);
if(a[2*poz].st == mid - l + 1)
a[poz].st = a[2*poz].st + a[2*poz+1].st;
else
a[poz].st = a[2*poz].st;
if(a[2*poz+1].dr == r - mid)
a[poz].dr = a[2*poz+1].dr + a[2*poz].dr;
else
a[poz].dr = a[2*poz+1].dr;
a[poz].mx = maxim (maxim (a[2 * poz].mx, a[2 * poz + 1].mx), a[2 * poz].dr + a[2 * poz + 1].st);
}
int main()
{
f >> n >> p;
a[1].dr = a[1].st = a[1].mx = n;
for(i=1; i<=p; ++i)
{
f>>c;
if(c == 1)
{
f >> poz >> m;
adauga (1, 1, n, poz, poz + m - 1);
}
if(c == 2)
{
f >> poz >> m;
elibereaza (1, 1, n, poz, poz + m - 1);
}
if(c == 3)
g << a[1].mx << "\n";
}
return 0;
}