#include <bits/stdc++.h>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
const int NMAX = 100005;
int n, p;
int lf[4 * NMAX];
int rg[4 * NMAX];
int c[4 * NMAX];
inline void Join(int x, int u, int v, int l, int r) {
int m = (l + r) / 2;
c[x] = max(max(c[u], c[v]), rg[u] + lf[v]);
lf[x] = (c[u] == m - l + 1 ? m - l + 1 + lf[v] : lf[u]);
rg[x] = (c[v] == r - m ? rg[u] + r - m : rg[v]);
}
inline void Push(int x, int l, int r) {
if (c[x] == r - l + 1) {
int m = (l + r) / 2;
c[x * 2] = m - l + 1;
lf[x * 2] = m - l + 1;
rg[x * 2] = m - l + 1;
c[x * 2 + 1] = r - m;
lf[x * 2 + 1] = r - m;
rg[x * 2 + 1] = r - m;
}
else {
if (c[x] == 0) {
c[x * 2] = 0;
lf[x * 2] = 0;
rg[x * 2] = 0;
c[x * 2 + 1] = 0;
lf[x * 2 + 1] = 0;
rg[x *2 + 1] =0;
}
}
}
void Build(int x, int l, int r) {
c[x] = (r - l + 1);
lf[x] = (r - l + 1);
rg[x] = (r - l + 1);
if (l < r) {
int m = (l + r) / 2;
Build(x * 2, l, m);
Build(x * 2 + 1, m + 1, r);
}
}
void Update(int x, int l, int r, int fi, int se, bool t) {
if (fi <= r && l <= se) {
if (fi <= l && r <= se) {
if (t == true) {
lf[x] = (r - l + 1);
rg[x] = (r - l + 1);
c[x] = (r - l + 1);
}
else {
lf[x] = 0;
rg[x] = 0;
c[x] = 0;
}
}
else {
int m = (l + r) / 2;
Push(x, l, r);
Update(x * 2, l, m, fi, se, t);
Update(x * 2 + 1, m + 1, r, fi, se, t);
Join(x, x * 2, x * 2 + 1, l, r);
}
}
}
int main() {
f >> n >> p;
Build(1, 1, n);
while (p--) {
int q;
f >> q;
if (q == 3) {
g << c[1] << "\n";
}
else {
int i, v;
f >> i >> v;
Update(1, 1, n, i, i + v - 1, q - 1);
}
}
return 0;
}