#include <cstdio>
const int MAXN = 1e5;
struct U {
int ans, b, e;
} aint[4 * MAXN + 1];
static inline int max(int a, int b) {
return a > b ? a : b;
}
void build(int pos, int l, int r) {
aint[pos].ans = aint[pos].b = aint[pos].e = r - l + 1;
if (l < r) {
int m = (l + r) >> 1;
build(2 * pos, l, m);
build(2 * pos + 1, m + 1, r);
}
}
void update(int pos, int l, int r, int a, int b, int t) {
if (a <= l && r <= b) {
aint[pos].ans = aint[pos].b = aint[pos].e = t * (r - l + 1);
} else {
int m = (l + r) >> 1;
if (!aint[pos].ans) {
aint[2 * pos] = aint[2 * pos + 1] = {0, 0, 0};
} else if (aint[pos].ans == r - l + 1) {
aint[2 * pos] = {m - l + 1, m - l + 1, m - l + 1};
aint[2 * pos + 1] = {r - m, r - m, r - m};
}
if (a <= m) {
update(2 * pos, l, m, a, b, t);
}
if (m < b) {
update(2 * pos + 1, m + 1, r, a, b, t);
}
aint[pos] = {max(aint[2 * pos].e + aint[2 * pos + 1].b, max(aint[2 * pos].ans, aint[2 * pos + 1].ans)),
aint[2 * pos].b, aint[2 * pos + 1].e};
if (aint[2 * pos].ans == m - l + 1) {
aint[pos].b += aint[2 * pos + 1].b;
}
if (aint[2 * pos + 1].ans == r - m) {
aint[pos].e += aint[2 * pos].e;
}
}
}
int main() {
int n, q, t, c, m;
FILE *fin = fopen("hotel.in", "r");
fscanf(fin, "%d%d", &n, &q);
build(1, 1, n);
FILE *fout = fopen("hotel.out", "w");
for (int i = 0; i < q; ++i) {
fscanf(fin, "%d", &t);
if (t == 3) {
fprintf(fout, "%d\n", aint[1].ans);
} else {
fscanf(fin, "%d%d", &c, &m);
update(1, 1, n, c, c + m - 1, t - 1);
}
}
fclose(fin);
fclose(fout);
return 0;
}