#include <iostream>
#include <fstream>
//N<=100000
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int N, P, i;
struct Str{
int seq, left, right;
void Get(int p){
seq=left=right=p;
return;
}
};
class BTree{
Str V[400001];
void Change(int left, int right, int a, int b, int position, int val){
int mid=(a+b)/2;
if(a==b){V[position].Get(val); return;}
if(right<=mid) Change(left, right, a, mid, 2*position, val);
else if(left>mid) Change(left, right, mid+1, b, 2*position+1, val);
else {Change(left, mid, a, mid, 2*position, val); Change(mid+1, right, mid+1, b, 2*position+1, val);}
V[position].seq=max(max(V[2*position].seq, V[2*position+1].seq), V[2*position].right+V[2*position+1].left);
V[position].left=V[2*position].left;
if(V[2*position].left==(mid-a+1)) V[position].left+=V[2*position+1].left;
V[position].right=V[2*position+1].right;
if(V[2*position+1].right==(b-mid)) V[position].right+=V[2*position].right;
return;
}
public:
int top(){
return V[1].seq;
}
void Set(int left, int right, int val){
Change(left, right, 1, N, 1, val);
return;
}
};
BTree Arb;
int main()
{
fin>>N>>P;
Arb.Set(1, N, 1);
for(i=1; i<=P; ++i){
int a, b, c;
fin>>c;
if(c==3) fout<<Arb.top()<<"\n";
else {
fin>>a>>b;
if(c==2) c=0;
Arb.Set(a, a+b-1, 1-c);
}
}
return 0;
}