#include <fstream>
#include <vector>
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
struct node{
int maxi,mdr,mst;
bool semodif;
};
vector<node> a;
void update(int nod,int l,int r,int st,int dr,bool cat)
{
if(st<=l && dr>=r)
{
if(!cat)
{
a[nod]={0,0,0,1};
}
else{
a[nod]={r-l+1,r-l+1,r-l+1,1};
}
return;
}
int mij=(l+r)/2;
if(a[nod].semodif){
if(a[nod].maxi)
{
a[nod*2]={mij-l+1,mij-l+1,mij-l+1,1};
a[nod*2+1]={r-mij,r-mij,r-mij,1};
}
else{
a[nod*2]={0,0,0,1};
a[nod*2+1]={0,0,0,1};
}
a[nod].semodif=false;
}
if(st<=mij)
update(2*nod,l,mij,st,dr,cat);
if(mij<dr)
update(2*nod+1,mij+1,r,st,dr,cat);
if(a[2*nod].mdr+a[2*nod+1].mst>max(a[nod*2].maxi,a[nod*2+1].maxi))
{
a[nod].maxi=a[nod*2].mdr+a[nod*2+1].mst;
}
else{
a[nod].maxi=max(a[nod*2].maxi,a[nod*2+1].maxi);
}
if(a[2*nod].mst==mij-l+1)
{
a[nod].mst=mij-l+1+a[2*nod+1].mst;
}
else{
a[nod].mst=a[2*nod].mst;
}
if(a[2*nod+1].mdr==r-mij)
{
a[nod].mdr=r-mij+a[2*nod].mdr;
}
else{
a[nod].mdr=a[2*nod+1].mdr;
}
}
int main()
{
int n,q;
cin>>n>>q;
a.resize(4*n+4);
a[1]={n,n,n,1};
while(q--)
{
int c;
cin>>c;
if(c==1)
{
int st,dr;
cin>>st>>dr;
dr+=st-1;
bool ocupat=0;
update(1,1,n,st,dr,ocupat);
}
else if(c==2)
{
int st,dr;
cin>>st>>dr;
dr+=st-1;
bool ocupat=1;
update(1,1,n,st,dr,ocupat);
}
else{
cout<<a[1].maxi<<'\n';
}
}
return 0;
}