#include <iostream>
#include <fstream>
#define DIM 100005
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int N,P;
struct{
int vmax, p, q;
}tree[10*DIM];
void initializare(int nod, int st, int dr){
if(st == dr)
tree[nod].vmax = tree[nod].p = tree[nod].q = 1;
else{
int mij = (st + dr)/2;
tree[nod].vmax = tree[nod].p = tree[nod].q = dr-st+1;
initializare(2*nod, st, mij);
initializare(2*nod+1, mij+1, dr);
}
}
void recalculation(int nod, int st, int dr){
int mij = (st + dr)/2;
tree[nod].vmax = max(max(tree[2*nod].vmax, tree[2*nod+1].vmax), tree[2*nod].q + tree[2*nod+1].p);
tree[nod].p = tree[2*nod].p;
if(tree[2*nod].p == mij-st+1)
tree[nod].p += tree[2*nod+1].p;
tree[nod].q = tree[2*nod +1].q;
if(tree[2*nod+1].q == dr - mij)
tree[nod].q += tree[2*nod].q;
}
void finalizare(int nod, int st, int dr, int op){
if(op == 1)
tree[nod].vmax = tree[nod].p = tree[nod].q = 0;
if(op == 2)
tree[nod].vmax = tree[nod].p = tree[nod].q = dr - st + 1;
if(st != dr){
int mij = (st + dr)/2;
finalizare(2*nod, st, mij, 1);
finalizare(2*nod+1, mij+1, dr, 1);
}
}
void update(int nod, int st, int dr, int a, int b, int op){
if(a <= st && dr <= b){
finalizare(nod, st, dr, op);
}
else{
int mij = (st + dr)/2;
if(a <= mij)
update(2*nod, st, mij, a, b, op);
if(b > mij)
update(2*nod+1, mij+1, dr, a, b, op);
recalculation(nod,st,dr);
}
}
int main()
{
f>>N>>P;
initializare(1,1,N);
int op, i, M;
for(int ind=1; ind<=P; ++ind){
f>>op;
if(op == 1 || op == 2){
f>>i>>M;
update(1,1,N,i,i+M-1,op);
}
if(op == 3)
g<<tree[1].vmax<<"\n";
}
}