#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100003;
struct NOD {
int zero, a, b;
};
int n, p, x, y;
NOD aint [4 * N + 10];
int unsolved [4 * N + 10];
void solve (int node, int st, int dr) {
if (st != dr)
unsolved [(node << 1)] = unsolved [(node << 1) + 1] = unsolved [node];
if (unsolved [node] == -1)
aint [node].zero = aint [node].a = aint [node].b = dr - st + 1;
else
aint [node].zero = aint [node].a = aint [node].b = 0;
unsolved [node] = 0;
}
void build (int node, int st, int dr) {
int m;
if (st == dr) {
aint [node].zero = aint [node].a = aint [node].b = 1;
return;
}
aint [node].zero = aint [node].a = aint [node].b = dr - st + 1;
m = (st + dr) / 2;
build (node << 1, st, m);
build ((node << 1) + 1, m + 1, dr);
}
void add (int node, int st, int dr) {
int m;
if (unsolved [node])
solve (node, st, dr);
if (x <= st && dr <= y) {
aint [node].zero = aint [node].a = aint [node].b = 0;
if (st != dr)
unsolved [(node << 1)] = unsolved [(node << 1) + 1] = 1;
return ;
}
m = (st + dr) / 2;
if (x <= m)
add (node << 1, st, m);
if (y > m)
add ((node << 1) + 1, m + 1, dr);
if (unsolved [node << 1])
solve (node << 1, st, m);
if (unsolved [(node << 1) + 1])
solve ((node << 1) + 1, m + 1, dr);
aint [node].zero = max (aint [(node << 1)].zero, aint [(node << 1) + 1].zero);
aint [node].zero = max (aint [node].zero, aint [node << 1].b + aint [(node << 1) + 1].a);
aint [node].a = aint [(node << 1)].a;
aint [node].b = aint [(node << 1) + 1].b;
if (aint [node].zero == dr - st + 1)
aint [node].a = aint [node].b = dr - st + 1;
if (aint [node].a == m - st + 1)
aint [node].a = aint [node].a + aint [(node << 1) + 1].a;
if (aint [node].b == dr - m)
aint [node].b = aint [node].b + aint [(node << 1)].b;
}
void release (int node, int st, int dr) {
int m;
if (unsolved [node])
solve (node, st, dr);
m = (st + dr) / 2;
if (x <= st && dr <= y) {
aint [node].zero = aint [node].a = aint [node].b = dr - st + 1;
if (st != dr) {
unsolved [node << 1] = -1;
unsolved [(node << 1) + 1] = -1;
}
return;
}
if (x <= m)
release (node << 1, st, m);
if (y > m)
release ((node << 1) + 1, m + 1, dr);
if (unsolved [node << 1])
solve (node << 1, st, m);
if (unsolved [(node << 1) + 1])
solve ((node << 1) + 1, m + 1, dr);
aint [node].zero = max (aint [(node << 1)].zero, aint [(node << 1) + 1].zero);
aint [node].zero = max (aint [node].zero, aint [(node << 1)].b + aint [(node << 1) + 1].a);
aint [node].a = aint [(node << 1)].a;
aint [node].b = aint [(node << 1) + 1].b;
if (aint [node].zero == dr - st + 1)
aint [node].a = aint [node].b = dr - st + 1;
if (aint [node].a == m - st + 1)
aint [node].a = aint [node].a + aint [(node << 1) + 1].a;
if (aint [node].b == dr - m)
aint [node].b = aint [node].b + aint [(node << 1)].b;
}
int main () {
int i, type;
freopen ("hotel.in", "r", stdin);
freopen ("hotel.out", "w", stdout);
scanf ("%d%d", &n, &p);
build (1, 1, n);
for (i = 1; i <= p; i ++) {
scanf ("%d", &type);
if (type == 3) {
printf ("%d\n", aint [1].zero);
continue;
}
scanf ("%d%d", &x, &y);
y = x + y - 1;
if (type == 1)
add (1, 1, n);
else
release (1, 1, n);
}
return 0;
}