#include <bits/stdc++.h>
FILE *in = fopen("hotel.in", "r"), *out = fopen("hotel.out", "w") ;
struct node {
int l, r, val ;
};
int n, q ;
node aint[1 << 20] ;
void build(int p, int L, int R) {
aint[p] = {R - L + 1, R - L + 1, R - L + 1} ;
if (L == R) return ;
int M = ((L + R) >> 1) ;
build(p << 1, L, M) ;
build((p << 1) + 1, M + 1, R) ;
}
void update(int p, int L, int R, int l, int r, bool f) {
if (L > R) return ;
if (L > r || R < l) return ;
if (l <= L && R <= r) {
if (f) aint[p] = {R - L + 1, R - L + 1, R - L + 1} ;
else aint[p] = {0, 0, 0} ;
return ;
}
int M((L + R) >> 1) ;
if (aint[p].val == 0) {
aint[(p << 1)] = {0, 0, 0} ;
aint[(p << 1) + 1] = {0, 0, 0} ;
}
if (aint[p].val == R - L + 1) {
aint[(p << 1)] = {M - L + 1, M - L + 1, M - L + 1} ;
aint[(p << 1) + 1] = {R - M, R - M, R - M} ;
}
if (l <= M) {
update((p << 1), L, M, l, r, f) ;
}
if (r > M) {
update((p << 1) + 1, M + 1, R, l, r, f) ;
}
aint[p].l = aint[(p << 1)].l ;
if (aint[(p << 1)].l == M - L + 1) {
aint[p].l += aint[(p << 1) + 1].l ;
}
aint[p].r = aint[(p << 1) + 1].r ;
if (aint[(p << 1) + 1].r == R - M) {
aint[p].r += aint[(p << 1)].r ;
}
aint[p].val = std::max(std::max(aint[(p << 1)].val, aint[(p << 1) + 1].val), aint[(p << 1)].r + aint[(p << 1) + 1].l) ;
}
int main() {
fscanf(in, "%d %d", &n, &q) ;
build(1, 1, n) ;
int k, x, y ;
while (q --) {
fscanf(in, "%d", &k) ;
if (k == 1) fscanf(in, "%d %d", &x, &y), update(1, 1, n, x, x + y - 1, 0) ;
if (k == 2) fscanf(in, "%d %d", &x, &y), update(1, 1, n, x, x + y - 1, 1) ;
if (k == 3) fprintf(out, "%d\n", aint[1].val) ;
}
}