/// BMDesktop
#include <iostream>
#include <fstream>
#define dim 400005
using namespace std;
string nameProb="hotel";
ifstream fin(nameProb+".in");
ofstream fout(nameProb+".out");
int a,b,n,q,tip,i,m;
struct nod
{
bool val=0;
int maxx=0,stanga=0,dreapta=0;
int lazy=0;
} A[dim];
void setval (int nod,int val)
{
A[nod].stanga=val;
A[nod].dreapta=val;
A[nod].maxx=val;
}
void build(int nod,int st,int dr)
{
if(st==dr)
{
A[nod].stanga=1;
A[nod].dreapta=1;
A[nod].maxx=1;
return;
}
int mid=(st+dr)/2;
build(2*nod,st,mid);
build(2*nod+1,mid+1,dr);
setval(nod,dr-st+1);
}
void afis(int nod)
{
cout<<nod<<" "<<A[nod].stanga<<" "<<A[nod].dreapta<<endl;
}
void lazyupdate(int nod,int st,int dr,int lazyval)
{
int mid=(st+dr)/2;
A[2*nod].lazy=1;
A[2*nod+1].lazy=1;
A[2*nod].val=A[nod].val;
A[2*nod+1].val=A[nod].val;
if(lazyval==1)
{
setval(2*nod,0);
setval(2*nod+1,0);
}
else
{
setval(2*nod,mid-st+1);
setval(2*nod+1,dr-(mid+1)+1);
}
}
void cazare(int nod,int st,int dr)
{
if(dr<a||st>b||st>dr)
return;
if(a<=st&&dr<=b)
{
A[nod].val=1;
A[nod].lazy=1;
setval(nod,0);
return;
}
int mid=(st+dr)/2;
if(A[nod].lazy==1)
{
lazyupdate(nod,st,dr,A[nod].val);
A[nod].lazy=0;
}
cazare(2*nod,st,mid);
cazare(2*nod+1,mid+1,dr);
A[nod].maxx = max(A[2*nod].maxx, A[2*nod+1].maxx);
if( A[2*nod].maxx == mid - st + 1 )
{
A[nod].stanga = A[2*nod].maxx + A[2*nod+1].stanga;
}
else
A[nod].stanga = A[2*nod].stanga;
if( A[2*nod+1].maxx == dr - (mid+1) +1 )
{
A[nod].dreapta = A[2*nod+1].maxx + A[2*nod].dreapta;
}
else
A[nod].dreapta = A[2*nod+1].dreapta;
A[nod].maxx=max(A[nod].maxx, max ( A[nod].stanga,A[nod].dreapta ) );
A[nod].maxx=max(A[nod].maxx, A[2*nod].dreapta+A[2*nod+1].stanga);
}
void iesire(int nod,int st,int dr)
{
if(dr<a||st>b||st>dr)
return;
int mid=(st+dr)/2;
if(a<=st&&dr<=b)
{
A[nod].val=0;
A[nod].lazy=1;
setval(nod,dr-mid+1);
return;
}
if(A[nod].lazy==1)
{
lazyupdate(nod,st,dr,A[nod].val);
A[nod].lazy=0;
}
iesire(2*nod,st,mid);
iesire(2*nod+1,mid+1,dr);
A[nod].maxx = max(A[2*nod].maxx, A[2*nod+1].maxx);
if( A[2*nod].maxx == mid - st + 1 )
{
A[nod].stanga = A[2*nod].maxx + A[2*nod+1].stanga;
}
else
A[nod].stanga = A[2*nod].stanga;
if( A[2*nod+1].maxx == dr - (mid+1) +1 )
{
A[nod].dreapta = A[2*nod+1].maxx + A[2*nod].dreapta;
}
else
A[nod].dreapta = A[2*nod+1].dreapta;
A[nod].maxx=max(A[nod].maxx, max ( A[nod].stanga,A[nod].dreapta ) );
A[nod].maxx=max(A[nod].maxx, A[2*nod].dreapta+A[2*nod+1].stanga);
}
int main()
{
fin>>n>>q;
build(1,1,n);
for(; q--;)
{
fin>>tip;
if(tip==3)
{
fout<<A[1].maxx<<"\n";
}
else
{
fin>>i>>m;
a=i;
b=i+m-1;
//cout<<a<<" "<<b<<endl;
if(tip==1)
{
cazare(1,1,n);
}
else
{
iesire(1,1,n);
}
}
}
}