#include <fstream>
#include <vector>
using namespace std;
struct Node
{
int left, right, best;
};
inline unsigned LeftSon(int a) { return (a << 1); }
inline unsigned RightSon(int a) { return (a << 1) + 1; }
void UpdateLazy(vector<Node> &aint, vector<int> &lazy, int node, int l, int r)
{
if (lazy[node] != 0) {
if (LeftSon(node) < lazy.size()) {
lazy[LeftSon(node)] = lazy[node];
}
if (RightSon(node) < lazy.size()) {
lazy[RightSon(node)] = lazy[node];
}
if (lazy[node] == 1) {
aint[node].left = aint[node].right = aint[node].best = 0;
} else {
aint[node].left = aint[node].right = aint[node].best = r - l + 1;
}
lazy[node] = 0;
}
}
void Update(vector<Node> &aint, vector<int> &lazy, int node, int l, int r, int a, int b, int val)
{
UpdateLazy(aint, lazy, node, l, r);
if (a <= l && r <= b) {
lazy[node] = val;
UpdateLazy(aint, lazy, node, l, r);
return;
}
int mid = l + (r - l) / 2;
if (a <= mid) {
Update(aint, lazy, LeftSon(node), l, mid, a, b, val);
UpdateLazy(aint, lazy, RightSon(node), mid + 1, r);
}
if (b > mid) {
Update(aint, lazy, RightSon(node), mid + 1, r, a, b, val);
UpdateLazy(aint, lazy, LeftSon(node), l, mid);
}
aint[node].left = aint[LeftSon(node)].left;
if (aint[node].left == mid - l + 1) {
aint[node].left += aint[RightSon(node)].left;
}
aint[node].right = aint[RightSon(node)].right;
if (aint[node].right == r - mid) {
aint[node].right += aint[LeftSon(node)].right;
}
aint[node].best = max(aint[node].left, aint[node].right);
aint[node].best = max(aint[node].best, aint[LeftSon(node)].right + aint[RightSon(node)].left);
aint[node].best = max(aint[node].best, max(aint[LeftSon(node)].best, aint[RightSon(node)].best));
}
int main()
{
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n, m;
fin >> n >> m;
vector<Node> aint(4 * n + 4);
vector<int> lazy(4 * n + 4, 0);
for (int i = 1; i <= n; ++i) {
Update(aint, lazy, 1, 1, n, i, i, -1);
}
while (m--) {
int t;
fin >> t;
if (t == 3) {
fout << aint[1].best << "\n";
} else {
int start, len;
fin >> start >> len;
Update(aint, lazy, 1, 1, n, start, start + len - 1, (t == 1) ? 1 : -1);
}
}
return 0;
}