#include <cstdio>
#include <algorithm>
using namespace std;
const int DMAX = 100003;
int st, dr;
bool h;
struct Aint {
int m, l, r;
}aint[DMAX << 1];
void AINT_build (const int l, const int r, const int nod) {
if (l == r) {
aint[nod].m = aint[nod].l = aint[nod].r = 1;
return;
}
const int m = (l + r) >> 1;
aint[nod].m = aint[nod].l = aint[nod].r = r - l + 1;
AINT_build (l, m, nod * 2);
AINT_build (m + 1, r, nod * 2 + 1);
}
void AINT_update (const int l, const int r, const int nod) {
if (dr < l || st > r)
return;
const int m = (l + r) >> 1;
if (st <= l && r <= dr) {
aint[nod].m = aint[nod].l = aint[nod].r = h ? r - l + 1 : 0;
return;
}
AINT_update (l, m, nod * 2);
AINT_update (m + 1, r, nod * 2 + 1);
aint[nod].l = aint[nod * 2].l != m - l + 1 ? aint[nod * 2].l : aint[nod * 2].l + aint[nod * 2 + 1].l;
aint[nod].r = aint[nod * 2 + 1].r != r - m ? aint[nod * 2 + 1]. r : aint[nod * 2 + 1].r + aint[nod * 2].r;
aint[nod].m = max(max(max(aint[nod].l, aint[nod].r), max(aint[nod * 2].m, aint[nod * 2 + 1].m)), aint[nod * 2].r + aint[nod * 2 + 1].l);
}
int main () {
freopen ("hotel.in", "r", stdin);
freopen ("hotel.out", "w", stdout);
int N, P, t, a, b;
scanf ("%d%d", &N, &P);
AINT_build (1, N, 1);
while (P--) {
scanf ("%d", &t);
if (t == 1) {
scanf ("%d%d", &a, &b);
st = a;
dr = a + b - 1;
h = 0;
AINT_update (1, N, 1);
continue;
}
if (t == 2) {
scanf ("%d%d", &a, &b);
st = a;
dr = a + b - 1;
h = 1;
AINT_update (1, N, 1);
continue;
}
printf ("%d\n", aint[1].m);
}
}