#include <bits/stdc++.h>
using namespace std;
const int nMax = 1e5 + 1;
struct Node {
bool modified;
int lenStart, lenFinish, longest;
};
Node aint[4 * nMax];
void Build(int node, int left, int right) {
if (left == right)
aint[node] = Node{false, 1, 1, 1};
else {
int middle = (left + right) / 2;
Build(2 * node, left, middle);
Build(2 * node + 1, middle + 1, right);
aint[node] = Node{false, right - left + 1, right - left + 1, right - left + 1};
}
}
void Update(int node, int left, int right, int start, int finish, int op) {
if (start <= left && right <= finish) {
if (op == 1)
aint[node] = Node{true, 0, 0, 0};
else
aint[node] = Node{true, right - left + 1, right - left + 1, right - left + 1};
} else {
int middle = (left + right) / 2;
if (aint[node].modified) {
if (aint[node].longest > 0) {
aint[2 * node] = Node{true, middle - left + 1, middle - left + 1, middle - left + 1};
aint[2 * node + 1] = Node{true, right - middle, right - middle, right - middle};
} else {
aint[2 * node] = Node{true, 0, 0, 0};
aint[2 * node + 1] = Node{true, 0, 0, 0};
}
aint[node].modified = false;
}
if (start <= middle)
Update(2 * node, left, middle, start, finish, op);
if (middle < finish)
Update(2 * node + 1, middle + 1, right, start, finish, op);
aint[node].longest = max(max(aint[2 * node].longest, aint[2 * node + 1].longest), aint[2 * node].lenFinish + aint[2 * node + 1].lenStart);
if (aint[2 * node].lenStart == middle - left + 1)
aint[node].lenStart = aint[2 * node].lenStart + aint[2 * node + 1].lenStart;
else
aint[node].lenStart = aint[2 * node].lenStart;
if (aint[2 * node + 1].lenFinish == right - middle)
aint[node].lenFinish = aint[2 * node + 1].lenFinish + aint[2 * node].lenFinish;
else
aint[node].lenFinish = aint[2 * node + 1].lenFinish;
}
}
int main() {
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n, q;
fin >> n >> q;
Build(1, 1, n);
while (q--) {
int op;
fin >> op;
if (op == 1 || op == 2) {
int start, Size;
fin >> start >> Size;
Update(1, 1, n, start, start + Size - 1, op);
} else
fout << aint[1].longest << "\n";
}
fin.close(), fout.close();
return 0;
}