# include <fstream>
# define DIM 600010
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct arbore{
int st,dr,Max,val;
} arb[DIM];
int n,m,st,dr,val,tp,i;
void schimba(int nod,int st,int dr){
if(arb[nod].val){
if(arb[nod].val==1){
arb[2*nod].val=1;
arb[2*nod+1].val=1;
arb[nod].val=0;
arb[nod].st=arb[nod].dr=arb[nod].Max=0;
}
else{
arb[2*nod].val=2;
arb[2*nod+1].val=2;
arb[nod].val=0;
arb[nod].st=arb[nod].dr=arb[nod].Max=dr-st+1;
}
}
}
void build(int nod,int st,int dr){
if(st==dr){
arb[nod].st=arb[nod].dr=arb[nod].Max=1;
return;
}
int mij=(st+dr)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
arb[nod].st=arb[nod].dr=arb[nod].Max=dr-st+1;
}
void update(int nod,int st,int dr,int p,int u,int tp){
if(p<=st&&u>=dr){
arb[nod].val=tp;
schimba(nod,st,dr);
return;
}
int mij=(st+dr)/2;
schimba(2*nod,st,mij);
schimba(2*nod+1,mij+1,dr);
if(p<=mij)
update(2*nod,st,mij,p,u,tp);
if(u>mij)
update(2*nod+1,mij+1,dr,p,u,tp);
arb[nod].Max=max(arb[2*nod].Max,arb[2*nod+1].Max);
arb[nod].Max=max(arb[nod].Max,arb[2*nod].dr+arb[2*nod+1].st);
arb[nod].st=arb[2*nod].st;
if(arb[nod].st==mij-st+1)
arb[nod].st+=arb[2*nod+1].st;
arb[nod].dr=arb[2*nod+1].dr;
if(arb[nod].dr==dr-mij)
arb[nod].dr+=arb[2*nod].dr;
}
int main () {
fin>>n>>m;
build(1,1,n);
for(i=1;i<=m;i++){
fin>>tp;
if(tp<=2){
fin>>st>>val;
dr=st+val-1;
schimba(1,1,n);
update(1,1,n,st,dr,tp);
continue;
}
fout<<arb[1].Max<<"\n";
}
return 0;
}