#include <fstream>
#define MAXN 100005 * 4
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int ssm[MAXN], L[MAXN], R[MAXN];
inline void Build(int poz, int st, int dr) {
int mij = (st + dr) / 2;
if (st == dr) {
ssm[poz] = L[poz] = R[poz] = 1;
return;
}
else {
Build(poz * 2, st, mij);
Build(poz * 2 + 1, mij + 1, dr);
ssm[poz] = L[poz] = R[poz] = dr - st + 1;
}
}
inline void Upload(int poz, int st, int dr, int ls, int ld, int val) {
int mij = (st + dr) / 2;
if (st > ld || dr < ls)
return;
if (st == dr) {
R[poz] = L[poz] = ssm[poz] = val;
return;
}
else {
Upload(poz * 2, st, mij, ls, ld, val);
Upload(poz * 2 + 1, mij + 1, dr, ls, ld, val);
R[poz] = R[poz * 2 + 1]; L[poz] = L[poz * 2];
if (ssm[poz * 2] == mij - st + 1)
L[poz] = max(L[poz], ssm[poz * 2] + L[poz * 2 + 1]);
if (ssm[poz * 2 + 1] == dr - mij)
R[poz] = max(R[poz], ssm[poz * 2 + 1] + R[poz * 2]);
ssm[poz] = max(ssm[poz * 2], max(ssm[poz * 2 + 1], L[poz * 2 + 1] + R[poz * 2]));
}
}
inline void Read() {
int N, m, tip, a, b;
fin >> N >> m;
Build(1, 1, N);
for (int i = 1; i <= m; i++) {
fin >> tip;
if (tip == 1) { ///cazare
fin >> a >> b;
Upload(1, 1, N, a, a + b - 1, 0);
}
else if (tip == 2) {
fin >> a >> b;
Upload(1, 1, N, a, a + b - 1, 1);
}
else
fout << ssm[1] << "\n";
}
}
int main () {
Read();
fin.close(); fout.close(); return 0;
}