#include <fstream>
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
const int NMAX = 1e5 + 5;
int st[NMAX * 4], lazy[NMAX * 4], ls, lsm;
void propagate(int l, int r, int node) {
st[node] += lazy[node] * (r - l + 1);
if (l != r) {
lazy[node << 1] += lazy[node];
lazy[node << 1 | 1] += lazy[node];
}
lazy[node] = 0;
}
void update(int l, int r, int node, int ql, int qr, int cer) {
propagate(l, r, node);
if (ql > r || qr < l)
return;
if (ql <= l && r <= qr) {
if (cer == 1) lazy[node]++;
else lazy[node]--;
propagate(l, r, node);
return;
}
int mid = (l + r) / 2;
update(l, mid, node << 1, ql, qr, cer);
update(mid + 1, r, node << 1 | 1, ql, qr, cer);
st[node] = st[node << 1] + st[node << 1 | 1];
}
void query(int l, int r, int node) {
propagate(l, r, node);
if (st[node] == r - l + 1) {
lsm = max(ls, lsm);
ls = 0;
return;
}
if (st[node] == 0) {
ls += (r - l + 1);
return;
}
int mid = (l + r) / 2;
query(l, mid, node << 1);
query(mid + 1, r, node << 1 | 1);
}
int main() {
int n, q;
cin >> n >> q;
while (q--) {
int cer;
cin >> cer;
if (cer < 3) {
int a, b;
cin >> a >> b;
b += a - 1;
if (a == 9)
cout << "";
update(1, n, 1, a, b, cer);
}
else {
ls = 0;
lsm = 0;
query(1, n, 1);
lsm = max(lsm, ls);
cout << lsm << '\n';
}
}
}