#include <cstdio>
#include <algorithm>
using namespace std;
#define NMAX 100050
#define ns (nod << 1)
#define nd ((nod << 1) + 1)
#define mij ((st + dr) >> 1)
struct arb {
int a, b, c;
} A[4 * NMAX];
int tip, n, m, i, a, b;
void arbore (int, int, int), update (int, int, int, int, int, int);
int main () {
freopen ("hotel.in", "r", stdin);
freopen ("hotel.out", "w", stdout);
scanf ("%d %d", &n, &m);
arbore (1, 1, n);
for (i = 1; i <= m; i++) {
scanf ("%d", &tip);
if (tip == 1) {
scanf ("%d %d", &a, &b);
update (1, 1, n, a, a + b - 1, 1);
}
if (tip == 2) {
scanf ("%d %d", &a, &b);
update (1, 1, n, a, a + b - 1, 0);
}
if (tip == 3) printf ("%d\n", A[1].c);
}
return 0;
}
void arbore (int nod, int st, int dr) {
if (st == dr) {
A[nod].a = A[nod].b = A[nod].c = 1;
return;
}
arbore (ns, st, mij);
arbore (nd, mij + 1, dr);
A[nod].a = A[nod].b = A[nod].c = dr - st + 1;
}
void update (int nod, int st, int dr, int a, int b, int nr) {
if (a <= st && dr <= b) {
if (!nr) A[nod].a = A[nod].b = A[nod].c = dr - st + 1;
else A[nod].a = A[nod].b = A[nod].c = 0;
return;
}
if (A[nod].c == 0) {
A[ns].a = A[ns].b = A[ns].c = 0;
A[nd].a = A[nd].b = A[nd].c = 0;
}
if (A[nod].c == dr - st + 1) {
A[ns].a = A[ns].b = A[ns].c = mij - st + 1;
A[nd].a = A[nd].b = A[nd].c = dr - mij;
}
if (a <= mij) update (ns, st, mij, a, b, nr);
if (mij < b) update (nd, mij + 1, dr, a, b, nr);
A[nod].a = A[ns].a;
if (A[ns].a == mij - st + 1) A[nod].a += A[nd].a;
A[nod].b = A[nd].b;
if (A[nd].b == dr - mij) A[nod].b += A[ns].b;
A[nod].c = max (A[nod].a, A[nod].b);
A[nod].c = max (A[nod].c, max (A[ns].c, max (A[nd].c, A[ns].b + A[nd].a)));
}