#include <bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n, m, tip, x, y;
int aint[400002], l[400002], r[400002];
void update (int nod, int st, int dr, int x, int y, int val) {
if (x == st && dr == y) {
aint[nod] = l[nod] = r[nod] = val * (dr - st + 1);
return;
}
int mij = (st + dr) / 2;
if (aint[nod] == 0)
aint[2 * nod] = aint[2 * nod + 1] = l[2 * nod] = l[2 * nod + 1] = r[2 * nod] = r[2 * nod + 1] = 0;
if (aint[nod] == (dr - st + 1)) {
aint[2 * nod] = l[2 * nod] = r[2 * nod] = mij - st + 1;
aint[2 * nod + 1] = l[2 * nod + 1] = r[2 * nod + 1] = dr - mij;
}
if (y <= mij)
update(2 * nod, st, mij, x, y, val);
else if (x > mij)
update(2 * nod + 1, mij + 1, dr, x, y, val);
else {
update(2 * nod, st, mij, x, mij, val);
update(2 * nod + 1, mij + 1, dr, mij + 1, y, val);
}
l[nod] = l[2 * nod];
r[nod] = r[2 * nod + 1];
if(l[2 * nod] == mij - st + 1)
l[nod] += l[2 * nod + 1];
if (r[2 * nod + 1] == dr - mij)
r[nod] += r[2 * nod];
aint[nod] = max(aint[2 * nod], max(aint[2 * nod + 1], r[2 * nod] + l[2 * nod + 1]));
}
int main()
{
fin >> n >> m;
update(1, 1, n, 1, n, 1);
while (m--) {
fin >> tip;
if(tip == 3)
fout << aint[1] << "\n";
else {
fin >> x >> y;
y = x + y - 1;
update(1, 1, n, x, y, 1 - tip % 2);
}
}
return 0;
}