#include <bits/stdc++.h>
#define Nmax 100002
FILE *fin = freopen("hotel.in", "r", stdin);
FILE *fout = freopen("hotel.out", "w", stdout);
using namespace std;
int n, m, lazy[4 * Nmax];
struct interval
{
int p;
int q;
int len;
} ST[4 * Nmax];
int Max(int x, int y)
{
return (x > y ? x : y);
}
void build(int node, int l, int r)
{
lazy[node] = -1;
ST[node].len = ST[node].p = ST[node].q = r - l + 1;
if(l == r) return;
int mid = (l + r) / 2;
build(2 * node, l, mid);
build(2 * node + 1, mid + 1, r);
}
void upd(int node, int l, int r, int val)
{
if(val == 1)
ST[node].p = ST[node].q = ST[node].len = 0;
else ST[node].p = ST[node].q = ST[node].len = r - l + 1;
}
void shift(int node)
{
lazy[2 * node] = lazy[node];
lazy[2 * node + 1] = lazy[node];
}
void update(int node, int s, int e, int l, int r, int v)
{
if(lazy[node] != -1)
{
upd(node, s, e, lazy[node]);
if(s != e)
shift(node);
lazy[node] = -1;
}
if(s > e || s > r || e < l) return;
/// completely included
if(l <= s && e <= r)
{
upd(node, s, e, v);
lazy[node] = v;
if(s != e)
shift(node);
lazy[node] = -1;
return;
}
if(s != e)
{
int ls = 2 * node, rs = ls + 1;
int mid = (s + e) / 2;
update(2 * node, s, mid, l, r, v);
update(2 * node + 1, mid + 1, e, l, r, v);
ST[node].len = Max(ST[ls].len, Max(ST[rs].len, ST[ls].q + ST[rs].p));
ST[node].p = ST[ls].p;
if(ST[node].p == (mid - s + 1) && ST[rs].p)
ST[node].p += ST[rs].p;
ST[node].q = ST[rs].q;
if(ST[node].q == (e - mid) && ST[ls].q)
ST[node].q += ST[ls].q;
}
}
int main()
{
int c, i, M;
scanf("%d %d", &n, &m);
build(1, 1, n);
while(m --)
{
scanf("%d", &c);
if(c == 3)
printf("%d\n", ST[1].len);
else
{
if(c == 2)
c = 0;
scanf("%d %d", &i, &M);
update(1, 1, n, i, i + M - 1, c);
}
}
return 0;
}