#include <fstream>
#define nmax (int)(1e5+1)
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
int n,q,task,x,y;
struct Aint{
int lazy,st,dr,maxi;
}aint[4*nmax];
void build(int nod,int st,int dr){
if(st==dr){
aint[nod]={0,1,1,1};
return ;
}
int mid=(st+dr)/2;
build(2*nod,st,mid);
build(2*nod+1,mid+1,dr);
aint[nod]={0,dr-st+1,dr-st+1,dr-st+1};
}
void Lazy(int nod,int st,int dr){
if(aint[nod].lazy==0)
return ;
if(st==dr){
if(aint[nod].lazy==1)
aint[nod]={0,0,0,0};
else
aint[nod]={0,1,1,1};
return ;
}
if(aint[nod].lazy==1){
aint[nod]={0,0,0,0};
aint[2*nod].lazy=aint[2*nod+1].lazy=1;
}else{
aint[nod]={0,dr-st+1,dr-st+1,dr-st+1};
aint[2*nod].lazy=aint[2*nod+1].lazy=2;
}
}
void update(int nod,int st,int dr,int x,int y,int task){
Lazy(nod,st,dr);
if(x<=st&&dr<=y){
aint[nod].lazy=task;
return ;
}
int mid=(st+dr)/2;
if(x<=mid)
update(2*nod,st,mid,x,y,task);
if(mid<y)
update(2*nod+1,mid+1,dr,x,y,task);
Lazy(2*nod,st,mid);
Lazy(2*nod+1,mid+1,dr);
aint[nod].maxi=max(max(aint[2*nod].maxi,aint[2*nod+1].maxi),aint[2*nod].dr+aint[2*nod+1].st);
aint[nod].st=aint[2*nod].st;
if(aint[2*nod].st==mid-st+1)
aint[nod].st=aint[2*nod].st+aint[2*nod+1].st;
aint[nod].dr=aint[2*nod+1].dr;
if(aint[2*nod+1].dr==dr-mid)
aint[nod].dr=aint[2*nod].dr+aint[2*nod+1].dr;
}
int main()
{
cin>>n>>q;
build(1,1,n);
while(q--){
cin>>task;
if(task==3){
cout<<aint[1].maxi<<'\n';
continue;
}
cin>>x>>y;
update(1,1,n,x,x+y-1,task);
}
return 0;
}
/// lazy = 0 secventa a fost deja procesata
/// lazy = 1 trebuie ocupate toate camerele din secventa
/// lazy = 2 trebuie eliberate toate camerele din secventa