#include <cstdio>
using namespace std;
const int N = 100005;
struct tip {int st, dr, s, subs; } v[4 * N];
int n, m, val, p1, p2;
void build(int st, int dr, int poz) {
if(st == dr) {
v[poz].st = v[poz].dr = v[poz].subs = 1;
return ;
}
int x = (st + dr) >> 1;
build(st, x, poz * 2);
build(x + 1, dr, poz * 2 + 1);
v[poz].st = v[poz].dr = v[poz].subs = dr - st + 1; ;
}
inline int max(int a, int b) {
return a > b ? a : b;
}
void update(int st, int dr, int poz) {
if(p1 > dr || p2 < st)
return ;
if(p1 <= st && dr <= p2) {
// fprintf(stderr, "%d %d\n", st, dr);
v[poz].st += val * (dr - st + 1);
v[poz].dr += val * (dr - st + 1);
v[poz].subs += val * (dr - st + 1);
v[poz].s = val;
return ;
}
int x = (st + dr) / 2;
if(v[poz].s) {
v[poz * 2].st += v[poz].s * (x - st + 1);
v[poz * 2].dr += v[poz].s * (x - st + 1);
v[poz * 2].subs = v[poz].s * (x - st + 1);
v[poz * 2].s = v[poz * 2 + 1].s = v[poz].s;
v[poz * 2 + 1].st += v[poz].s * (dr - x);
v[poz * 2 + 1].dr += v[poz].s * (dr - x);
v[poz * 2 + 1].subs = v[poz].s * (dr - x);
v[poz].s = 0;
}
update(st, x, poz * 2);
update(x + 1, dr, poz * 2 + 1);
v[poz].subs = max(v[poz * 2].subs, v[poz * 2 + 1].subs);
v[poz].subs = max(v[poz].subs, v[poz * 2].dr + v[poz * 2 + 1].st);
v[poz].st = v[poz * 2].st;
if(v[poz * 2].st == x - st + 1)
v[poz].st += v[poz * 2 + 1].st;
v[poz].dr = v[poz * 2 + 1].dr;
if(v[poz * 2 + 1].dr == dr - x)
v[poz].dr += v[poz * 2].dr;
}
int main() {
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
int i, op;
scanf("%d %d", &n, &m);
build(1, n, 1);
// return 0;
for(;m; --m) {
scanf("%d", &op);
if(op == 1) {
scanf("%d %d", &p1, &p2);
p2 = p1 + p2 - 1;
val = -1;
update(1, n, 1);
// printf("%d %d\n", p1, p2);
}
if(op == 2) {
scanf("%d %d", &p1, &p2);
p2 = p1 + p2 - 1;
val = 1;
update(1, n, 1);
// printf("%d %d\n", p1, p2);
}
if(op == 3)
printf("%d\n", v[1].subs);
/*
if(op <= 2)
fprintf(stderr, "\n");
for(i = 1; i <= 30; ++i)
fprintf(stderr, "%d %d %d %d\n",i, v[i].st, v[i].dr, v[i].subs);
fprintf(stderr, "\n"); */
}
return 0;
}