#include <cstdio>
#include <algorithm>
using namespace std;
struct inter {
int zmax, zst, zdr;
} v[400005];
void init(int nod, int st, int dr) {
v[nod].zmax = v[nod].zst = v[nod].zdr = dr - st + 1;
if(st < dr) {
int med = (st + dr) / 2;
init(2 * nod, st, med);
init(2 * nod + 1, med + 1, dr);
}
}
void update(int nod, int st, int dr, int a, int b, int val) {
if(a <= st && dr <= b) {
if(val == 2) {
v[nod].zmax = v[nod].zst = v[nod].zdr = dr - st + 1;
} else {
v[nod].zmax = v[nod].zst = v[nod].zdr = 0;
}
} else {
int med = (st + dr) / 2;
if(v[nod].zmax == 0) {
v[2 * nod].zmax = v[2 * nod + 1].zmax = v[2 * nod].zst = v[2 * nod + 1].zst = v[2 * nod].zdr = v[2 * nod + 1].zdr = 0;
}
if(v[nod].zmax == dr - st + 1) {
v[2 * nod].zmax = v[2 * nod].zst = v[2 * nod].zdr = med - st + 1;
v[2 * nod + 1].zmax = v[2 * nod + 1].zst = v[2 * nod + 1].zdr = dr - med;
}
if(a <= med) {
update(2 * nod, st, med, a, b, val);
}
if(med + 1 <= b) {
update(2 * nod + 1, med + 1, dr, a, b, val);
}
v[nod].zst = v[2 * nod].zst;
if(v[2 * nod].zmax == med - st + 1) {
v[nod].zst += v[2 * nod + 1].zst;
}
v[nod].zdr = v[2 * nod + 1].zdr;
if(v[2 * nod + 1].zmax == dr - med) {
v[nod].zdr += v[2 * nod].zdr;
}
v[nod].zmax = max(v[2 * nod].zdr + v[2 * nod + 1].zst, max(v[2 * nod].zmax, v[2 * nod + 1].zmax));
}
}
int main() {
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
int n, p;
scanf("%d%d", &n, &p);
init(1, 1, n);
for(int i = 1; i <= p; ++ i) {
int t, x, y;
scanf("%d", &t);
if(t == 3) {
printf("%d\n", v[1].zmax);
} else {
scanf("%d%d", &x, &y);
update(1, 1, n, x, x + y - 1, t);
}
}
return 0;
}