#include <bits/stdc++.h>
using namespace std;
#define ST_DIO 1
#if ST_DIO
#define fin cin
#define fout cout
#else
ifstream fin("hotel.in");
ofstream fout("hotel.out");
#endif // ST_DIO
struct Nod {
int sum, pref, suff;
} aint[400002];
int lazy[400002];
int n, q, i;
static inline pair<int, int> NodUrm(int nod, int st, int dr) {
int mij = st + (dr - st) / 2;
int nodSt = 2 * nod;
int nodDr = 2 * nod + 1;
return pair<int, int>{nodSt, nodDr};
}
static inline Nod Add(Nod a, Nod b, int st, int dr) {
int mij = st + (dr - st) / 2;
int lungSt = mij - st + 1;
int lungDr = dr - mij;
Nod c = Nod{0, a.pref, b.suff};
if(a.pref == lungSt) c.pref += b.pref;
if(b.suff == lungDr) c.suff += a.suff;
c.sum = max({a.sum, b.sum, a.suff + b.pref});
return c;
}
static inline void SpreadLazy(int nod, int st, int dr) {
if(lazy[nod] == 0) return;
int nodSt, nodDr;
tie(nodSt, nodDr) = NodUrm(nod, st, dr);
if(lazy[nod] == 1) {
aint[nodSt] = aint[nodDr] = {0, 0, 0};
lazy[nodSt] = lazy[nodDr] = 1;
}
else if(lazy[nod] == 2) {
int mij = st + (dr - st) / 2;
int lungSt = mij - st + 1;
int lungDr = dr - mij;
aint[nodSt] = {lungSt, lungSt, lungSt};
aint[nodDr] = {lungDr, lungDr, lungDr};
lazy[nodSt] = lazy[nodDr] = 2;
}
lazy[nod] = 0;
}
static inline void Build(int nod, int st, int dr) {
if(st == dr) aint[nod] = {1, 1, 1};
else {
int mij = st + (dr - st) / 2;
int nodSt, nodDr;
tie(nodSt, nodDr) = NodUrm(nod, st, dr);
Build(nodSt, st, mij);
Build(nodDr, mij + 1, dr);
aint[nod] = Add(aint[nodSt], aint[nodDr], st, dr);
}
}
static inline void Update(int nod, int st, int dr, int qst, int qdr, int val) {
if(qst <= st && dr <= qdr) {
if(val == 0) {
aint[nod] = {0, 0, 0};
lazy[nod] = 1;
}
else {
int lung = dr - st + 1;
aint[nod] = {lung, lung, lung};
lazy[nod] = 2;
}
}
else {
int mij = st + (dr - st) / 2;
int nodSt, nodDr;
tie(nodSt, nodDr) = NodUrm(nod, st, dr);
SpreadLazy(nod, st, dr);
if(qst <= mij) Update(nodSt, st, mij, qst, qdr, val);
if(mij < qdr) Update(nodDr, mij + 1, dr, qst, qdr, val);
aint[nod] = Add(aint[nodSt], aint[nodDr], st, dr);
}
}
static inline void Precalc() {}
static inline void Test() {
fin >> n >> q;
Build(1, 1, n);
while(q--) {
int op;
fin >> op;
if(op == 1) {
int x, y;
fin >> x >> y;
Update(1, 1, n, x, x + y - 1, 0);
}
else if(op == 2) {
int x, y;
fin >> x >> y;
Update(1, 1, n, x, x + y - 1, 1);
}
else fout << aint[1].sum << "\n";
}
}
int main() {
if(ST_DIO) ios_base::sync_with_stdio(false);
fin.tie(nullptr);
fout.tie(nullptr);
Precalc();
int t = 1;
//fin >> t;
while(t--) Test();
return 0;
}