#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
struct Node {
int ans, pref, suff;
};
Node aint[4 * MAXN];
void build(int node, int l, int r) {
aint[node].ans = aint[node].pref = aint[node].suff = r - l + 1;
if (l < r) {
int mid = (l + r) / 2;
build(2 * node, l, mid);
build(2 * node + 1, mid + 1, r);
}
}
void update(int node, int l, int r, int ql, int qr, int val) {
if (ql <= l && r <= qr) {
aint[node].ans = aint[node].pref = aint[node].suff = val * (r - l + 1);
return;
}
int mid = (l + r) / 2, lson = 2 * node, rson = 2 * node + 1;
if (aint[node].ans == 0)
aint[lson] = aint[rson] = {0, 0, 0};
else if (aint[node].ans == r - l + 1) {
aint[lson] = {mid - l + 1, mid - l + 1, mid - l + 1};
aint[rson] = {r - mid, r - mid, r - mid};
}
if (ql <= mid)
update(lson, l, mid, ql, qr, val);
if (mid < qr)
update(rson, mid + 1, r, ql, qr, val);
aint[node] = {max(aint[lson].suff + aint[rson].pref, max(aint[lson].ans, aint[rson].ans)), aint[lson].pref, aint[rson].suff};
if (aint[lson].ans == mid - l + 1)
aint[node].pref += aint[rson].pref;
if (aint[rson].ans == r - mid)
aint[node].suff += aint[lson].suff;
}
int main()
{
int n, p, type, x, l;
ifstream fin("hotel.in");
fin >> n >> p;
build(1, 1, n);
ofstream fout("hotel.out");
for (p = p; p > 0; --p) {
fin >> type;
if (type == 3)
fout << aint[1].ans << '\n';
else {
fin >> x >> l;
l += x - 1;
update(1, 1, n, x, l, type - 1);
}
}
fin.close();
fout.close();
return 0;
}