#include <cstdio>
#include <string>
#include <cstring>
#define fs (nod << 1)
#define fd ((nod << 1) + 1)
#define mid ((st + dr) >> 1)
#define maxn 400050
using namespace std;
int A[maxn], B[maxn], C[maxn];
void build (int nod, int st, int dr)
{
if (st == dr) {
A[nod] = B[nod] = C[nod] = 1;
return ;
}
build (fs, st, mid);
build (fd, mid + 1, dr);
A[nod] = B[nod] = C[nod] = dr - st + 1;
}
void update (int nod, int st, int dr, int a, int b, int op)
{
//a st dr b
if (a <= st && b >= dr) {
if (op == 1) A[nod] = B[nod] = C[nod] = 0;
else A[nod] = B[nod] = C[nod] = dr - st + 1;
return ;
}
if (A[nod] == 0)
{
A[fs] = B[fs] = C[fs] = 0;
A[fd] = B[fd] = C[fd] = 0;
}
if (A[nod] == dr - st + 1)
{
A[fs] = B[fs] = C[fs] = mid - st + 1;
A[fd] = B[fd] = C[fd] = dr - mid;
}
if (a <= mid) update (fs, st, mid, a, b, op);
if (b > mid) update (fd, mid + 1, dr, a, b, op);
B[nod] = B[fs];
C[nod] = C[fd];
if (B[fs] == mid - st + 1) B[nod] += B[fd];
if (C[fd] == dr - mid) C[nod] += C[fs];
A[nod] = max (B[nod], C[nod]);
A[nod] = max (A[nod], max (A[fs], max (A[fd], C[fs] + B[fd])));
}
int main ()
{
freopen ("hotel.in", "r", stdin);
freopen ("hotel.out", "w", stdout);
int n, m, op, x, y;
scanf ("%d %d\n", &n, &m);
build (1, 1, n);
while (m--)
{
scanf ("%d", &op);
if (op == 1 || op == 2)
{
scanf ("%d %d\n", &x, &y);
update (1, 1, n, x, x + y - 1, op);
}
else printf ("%d\n", A[1]);
}
return 0;
}