#include <bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct node {
int pref, suf, best;
short lazy;
} emptyNode{0, 0, 0, -1};
struct SegTree {
int Size;
vector<node> tree;
SegTree(int N) {
Size = 1;
while (Size < N)
Size <<= 1;
tree.resize(Size << 1);
}
node join(const node &a, const node &b, int len_a, int len_b) {
node x;
x.pref = a.pref;
x.lazy = -1;
if (a.pref == len_a)
x.pref += b.pref;
x.suf = b.suf;
if (b.suf == len_b)
x.suf += a.suf;
x.best = max({a.best, b.best, a.suf + b.pref});
return x;
}
void build(int x, int lx, int rx) {
if (lx == rx) {
tree[x] = {1, 1, 1, -1};
return;
}
int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
build(lSon, lx, mid);
build(rSon, mid + 1, rx);
tree[x] = join(tree[lSon], tree[rSon], mid - lx + 1, rx - mid);
}
void push(int x) {
short val = tree[x].lazy;
if (val == -1)
return;
for (int i = 0; i < 2; ++i) {
int son = x << 1 | i;
if (val)
tree[son] = {0, 0, 0, val};
else tree[son] = {1, 1, 1, val};
}
tree[x].lazy = -1;
}
void update(int x, int lx, int rx, int st, int dr, bool val) {
if (st <= lx && rx <= dr) {
if (val)
tree[x] = {0, 0, 0, val};
else tree[x] = {1, 1, 1, val};
return;
}
push(x);
int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
if (st <= mid)
update(lSon, lx, mid, st, dr, val);
if (mid < dr)
update(rSon, mid + 1, rx, st, dr, val);
tree[x] = join(tree[lSon], tree[rSon], mid - lx + 1, rx - mid);
}
};
int main() {
int N, Q;
fin >> N >> Q;
SegTree tree(N);
tree.build(1, 1, N);
for (int q = 0; q < Q; ++q) {
int t;
fin >> t;
if (t < 3) {
int st, M;
fin >> st >> M;
tree.update(1, 1, N, st, st + M - 1, t == 1);
} else fout << tree.tree[1].best << '\n';
}
fin.close();
fout.close();
return 0;
}