#include <bits/stdc++.h>
#define Nmax 200002
using namespace std;
ifstream fin("prieteni2.in");
ofstream fout("prieteni2.out");
int N, Q, ans, curr;
int le[4 * Nmax], ri[4 * Nmax], bst[4 * Nmax];
void update(int node, int l, int r, int pos, int val) {
if (l == r) le[node] = ri[node] = bst[node] = val;
else {
int mid = (l + r) / 2, x = 2 * node, y = 2 * node + 1;
if (pos <= mid) update(x, l, mid, pos, val);
else update(y, mid + 1, r, pos, val);
le[node] = le[x], ri[node] = ri[y];
if (le[x] == mid - l + 1) le[node] = max(le[node], le[x] + le[y]);
if (ri[y] == r - mid) ri[node] = max(ri[node], ri[y] + ri[x]);
bst[node] = max(bst[x], bst[y]);
bst[node] = max(bst[node], ri[x] + le[y]);
}
}
void query(int node, int l, int r, int a, int b) {
if (l >= a && r <= b) {
ans = max(ans, curr + le[node]);
ans = max(ans, bst[node]);
if (le[node] == r - l + 1) curr += le[node];
else curr = ri[node];
}
else {
int mid = (l + r) / 2;
if (a <= mid) query(2 * node, l, mid, a, b);
if (mid < b) query(2 * node + 1, mid + 1, r, a, b);
}
}
int main()
{
fin >> N >> Q;
while (Q--) {
int op, x, y;
fin >> op;
if (op == 3) {
fin >> x >> y;
ans = curr = 0;
if (x < y) query(1, 1, N - 1, x, y - 1);
fout << ans + 1 << '\n';
}
else {
fin >> x;
if (op == 1) update(1, 1, N - 1, x, 1);
else update(1, 1, N - 1, x, 0);
}
}
return 0;
}