#include <fstream>
using namespace std;
struct nod
{
int st,dr;
int pref,suf,best;
bool lenes;
int val_lenes;
nod()
{
st=0;
dr=0;
pref=0;
suf=0;
best=0;
lenes=0;
val_lenes=0;
}
}arb[262144],aux;
bool v[100005];
void build(int st,int dr,int poz)
{
arb[poz].st=st;
arb[poz].dr=dr;
arb[poz].suf=arb[poz].pref=arb[poz].best=(dr-st+1);
arb[poz].lenes=0;
arb[poz].val_lenes=0;
if(st<dr)
{
int mijl=(st+dr)>>1;
build(st,mijl,poz<<1);
build(mijl+1,dr,(poz<<1)+1);
}
}
int maxim(int a,int b)
{
if(a>b)
return a;
return b;
}
int maxim(int a,int b,int c)
{
return maxim(maxim(a,b),c);
}
void recompute(nod &a,nod b,nod c)
{
// cout<<"recomputare:"<<endl;
if((b.dr-b.st+1)==b.pref)
{
// cout<<"noroc1"<<endl;
a.pref=b.pref+c.pref;
}
else
a.pref=b.pref;
//cout<<a.pref<<' '<<b.pref<<' '<<c.pref<<endl;
if((c.dr-c.st+1)==c.suf)
{
// cout<<"noroc2"<<endl;
a.suf=c.suf+b.suf;
}
else
a.suf=c.suf; //GRESEALA: era scris a.pref in loc de suf!!!!!!
//cout<<a.suf<<' '<<b.suf<<' '<<c.suf<<endl;
a.best=maxim(b.best,c.best,b.suf+c.pref);
// cout<<a.best<<' '<<b.best<<' '<<c.best<<endl;
}
void fii_lenesi(int poz)
{
arb[poz<<1].lenes=1;
arb[(poz<<1)+1].lenes=1;
arb[poz<<1].val_lenes=arb[poz].val_lenes;
arb[(poz<<1)+1].val_lenes=arb[poz].val_lenes;
arb[poz<<1].suf=arb[poz<<1].pref=arb[poz<<1].best = (1-((int)arb[poz].val_lenes))*(arb[poz<<1].dr-arb[poz<<1].st+1);
arb[(poz<<1)+1].suf=arb[(poz<<1)+1].pref=arb[(poz<<1)+1].best=(1-((int)arb[poz].val_lenes))*(arb[(poz<<1)+1].dr-arb[(poz<<1)+1].st+1);
arb[poz].lenes=0;
}
void update_0(int st,int dr,int poz)
{
// cout<<"update_0("<<st<<","<<dr<<","<<poz<<")= "<<arb[poz].st<<' '<<arb[poz].dr<<endl;
if((arb[poz].dr<st) || (arb[poz].st>dr))
{
// cout<<"caz 1"<<endl;
return;
}
//cout<<"ccccccccccccccccccc"<<endl;
if(arb[poz].st==arb[poz].dr && arb[poz].st==st)
{
// cout<<"caz 2"<<endl;
v[st]=0;
arb[poz].pref=arb[poz].suf=arb[poz].best=1;
arb[poz].lenes=0;
arb[poz].val_lenes=0;
return;
}
// cout<<"b"<<endl;
if(arb[poz].lenes)
{
// cout<<"caz 4"<<endl;
fii_lenesi(poz);
}
if(arb[poz].st==st && arb[poz].dr==dr)
{
// cout<<"caz 3"<<endl;
arb[poz].lenes=1;
arb[poz].val_lenes=0;
arb[poz].pref=arb[poz].suf=arb[poz].best=(arb[poz].dr-arb[poz].st+1);
return;
}
// cout<<"a"<<endl;
// cout<<"caz 5"<<endl;
int mijl=(arb[poz].st+arb[poz].dr)>>1;
if(dr<=mijl)
update_0(st,dr,poz<<1);
else if(st>mijl)
update_0(st,dr,(poz<<1)+1);
else
update_0(st,mijl,poz<<1),update_0(mijl+1,dr,(poz<<1)+1);
//cout<<"recompute la "<<poz<<' '<<arb[poz].st<<' '<<arb[poz].dr<<endl;
recompute(arb[poz],arb[poz<<1],arb[(poz<<1)+1]);
}
void update_1(int st,int dr,int poz)
{
//cout<<"update_1("<<st<<","<<dr<<","<<poz<<")= "<<arb[poz].st<<' '<<arb[poz].dr<<endl;
if((arb[poz].dr<st) || (arb[poz].st>dr))
{
// cout<<"caz 1"<<endl;
return;
}
// cout<<"ccccccccccccccccccc"<<endl;
if(arb[poz].st==arb[poz].dr && arb[poz].st==st)
{
// cout<<"caz 2"<<endl;
v[st]=1;
arb[poz].pref=arb[poz].suf=arb[poz].best=0;
arb[poz].lenes=0;
arb[poz].val_lenes=0;
return;
}
// cout<<"b"<<endl;
if(arb[poz].lenes)
{
// cout<<"caz 4"<<endl;
fii_lenesi(poz);
}
if(arb[poz].st==st && arb[poz].dr==dr)
{
// cout<<"caz 3"<<endl;
arb[poz].lenes=1;
arb[poz].val_lenes=1;
arb[poz].pref=arb[poz].suf=arb[poz].best=0;
return;
}
// cout<<"a"<<endl;
// cout<<"caz 5"<<endl;
int mijl=(arb[poz].st+arb[poz].dr)>>1;
if(dr<=mijl)
update_1(st,dr,poz<<1);
else if(st>mijl)
update_1(st,dr,(poz<<1)+1);
else
update_1(st,mijl,poz<<1),update_1(mijl+1,dr,(poz<<1)+1);
//cout<<"recompute la "<<poz<<' '<<arb[poz].st<<' '<<arb[poz].dr<<endl;
recompute(arb[poz],arb[poz<<1],arb[(poz<<1)+1]);
}
/*
void query(int st,int dr,int poz)
{
if((arb[poz].dr<st) || (arb[poz].st>dr))
return;
if(arb[poz].st>=st && arb[poz].dr<=dr)
{
recompute(aux,aux,arb[poz]);
return;
}
if(arb[poz].lenes)
fii_lenesi(poz);
int mijl=(arb[poz].st+arb[poz].dr)>>1;
if(dr<=mijl)
query(st,dr,poz<<1);
else if(st>mijl)
query(st,dr,(poz<<1)+1);
else
query(st,mijl,poz<<1),query(mijl+1,dr,(poz<<1)+1);
}*/
int main()
{
ifstream cin("hotel.in");
ofstream cout("hotel.out");
int n,p,cod,i,a,b;
cin>>n>>p;
build(1,n,1);
for(i=0;i<p;i++)
{
cin>>cod;
if(cod<3)
{
cin>>a>>b;
b=(a+b-1);
}
if(cod==1)
update_1(a,b,1);
else if(cod==2)
update_0(a,b,1);
else
{
// aux.st=a;
// aux.dr=a-1;
// aux.lenes=0;
//aux.val_lenes=0;
// aux.pref=aux.suf=aux.best=0;
// query(1,n,1);
cout<<arb[1].best<<'\n';
}
}
/*
gol.st=0;
gol.dr=0;
plin.st=0;
plin.dr=0;
*/
// gol.suf=
cin.close();
cout.close();
//system("PAUSE");
return 0;
}