#include <bits/stdc++.h>
#define MAXN 400000
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct cam{
int pref, suff, best;
} aint[4 * MAXN];
cam combine(cam A, cam B, int lenA, int lenB){
cam C;
C.pref = A.pref;
if(A.pref == lenA){
C.pref += B.pref;
}
C.suff = B.suff;
if(B.suff == lenB){
C.suff += A.suff;
}
C.best = max(max(A.best, B.best), A.suff + B.pref);
return C;
}
void build(int nod, int st, int dr){
int mij;
if(st == dr){
aint[nod].best = aint[nod].pref = aint[nod].suff = 1;
}else{
mij = (st + dr) / 2;
build(2 * nod, st, mij);
build(2 * nod + 1, mij + 1, dr);
aint[nod] = combine(aint[2 * nod], aint[2 * nod + 1], mij - st + 1, dr - mij);
}
}
void update(int nod, int st, int dr, int l, int r, int val){
int mij, len;
if(!(st > r || dr < l)){
if(st == dr){
len = dr - st + 1;
aint[nod].pref = aint[nod].suff = aint[nod].best = val * len;
}else{
mij = (st + dr) / 2;
update(2 * nod, st, mij, l, r, val);
update(2 * nod + 1, mij + 1, dr, l, r, val);
aint[nod] = combine(aint[2 * nod], aint[2 * nod + 1], mij - st + 1, dr - mij);
}
}
}
int main()
{
int n, p, tip, i, m;
fin >> n >> p;
build(1, 1, n);
while(p --){
fin >> tip;
if(tip == 3){
fout << aint[1].best << "\n";
}else if(tip == 1){
fin >> i >> m;
update(1, 1, n, i, i + m - 1, 0);
}else{
fin >> i >> m;
update(1, 1, n, i, i + m - 1, 1);
}
}
return 0;
}