#include <fstream>
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
struct aint{
int best,st,dr;
} v[400001];
int lazy[400001];
void push(int nod,int st,int dr){
if(lazy[nod]==1){
v[nod].best=v[nod].st=v[nod].dr=0;
if(st!=dr){
lazy[2*nod]=lazy[2*nod+1]=lazy[nod];
}
lazy[nod]=-1;
}
if(lazy[nod]==0){
v[nod].best=v[nod].st=v[nod].dr=(dr-st+1);
if(st!=dr){
lazy[2*nod]=lazy[2*nod+1]=lazy[nod];
}
lazy[nod]=-1;
}
}
aint combin(aint a,aint b,int st,int dr){
aint rasp;
rasp.best=max(a.dr+b.st,max(a.best,b.best));
int mij=(st+dr)/2;
rasp.st=a.st;
if(a.st==(mij-st+1)) rasp.st=a.st+b.st;
rasp.dr=b.dr;
if(b.dr==(dr-mij)) rasp.dr=a.dr+b.dr;
return rasp;
}
aint get_value(int nod,int st,int dr){
push(nod,st,dr);
return v[nod];
}
void update(int nod,int st,int dr,int a,int b,int val){
push(nod,st,dr);
if(a>dr || st>b) return;
if(a<=st && dr<=b){
lazy[nod]=val;
return;
}
int mij=(st+dr)/2;
update(2*nod,st,mij,a,b,val);
update(2*nod+1,mij+1,dr,a,b,val);
v[nod]=combin(get_value(2*nod,st,mij),get_value(2*nod+1,mij+1,dr),st,dr);
}
void init(int nod,int st,int dr){
if(st==dr){
v[nod].best=v[nod].st=v[nod].dr=1;
return ;
}
int mij=(st+dr)/2;
init(2*nod,st,mij);
init(2*nod+1,mij+1,dr);
v[nod]=combin(v[2*nod],v[2*nod+1],st,dr);
}
int main()
{
int n,q,i,cer,a,m;
cin>>n>>q;
for(i=1;i<=4*n;i++){
lazy[i]=-1;
}
init(1,1,n);
for(i=1;i<=q;i++){
cin>>cer;
if(cer==3){
push(1,1,n);
cout<<v[1].best<<"\n";
}else if(cer==2){
cin>>a>>m;
update(1,1,n,a,a+m-1,0);
}else{
cin>>a>>m;
update(1,1,n,a,a+m-1,1);
}
}
return 0;
}