#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int Nmax=100005;
struct node{
int maxlen;
int llen;
int rlen;
};
node aint[4*Nmax];
int lazy[4*Nmax];
void build(int nod,int st,int dr)
{
if(st==dr)
{
node x;
x.maxlen=1;
x.llen=1;
x.rlen=1;
aint[nod]=x;
return;
}
int mid=(st+dr)/2;
build(2*nod,st,mid);
build(2*nod+1,mid+1,dr);
if(aint[2*nod].llen!=(mid-st+1)) aint[nod].llen=aint[2*nod].llen;
else aint[nod].llen=aint[2*nod].llen+aint[2*nod+1].llen;
if(aint[2*nod+1].rlen!=(dr-mid)) aint[nod].rlen=aint[2*nod+1].rlen;
else aint[nod].rlen=aint[2*nod].rlen+aint[2*nod+1].rlen;
aint[nod].maxlen=max(aint[2*nod].maxlen,aint[2*nod+1].maxlen);
aint[nod].maxlen=max(aint[nod].maxlen,aint[2*nod].rlen+aint[2*nod+1].llen);
return;
}
void update(int nod,int st,int dr,int i,int j,int tip)
{
if(i<=st && dr<=j)
{
if(tip==1)
{
aint[nod].maxlen=0;
aint[nod].llen=0;
aint[nod].rlen=0;
lazy[nod]=1;
}
else
{
aint[nod].maxlen=dr-st+1;
aint[nod].llen=dr-st+1;
aint[nod].rlen=dr-st+1;
lazy[nod]=2;
}
///cout<<nod<<' '<<st<<' '<<dr<<' '<<' '<<aint[nod].llen<<' '<<aint[nod].maxlen<<' '<<aint[nod].rlen<<'\n';
return;
}
int mid=(st+dr)/2;
if(lazy[nod]==1)
{
aint[2*nod].maxlen=aint[2*nod+1].maxlen=0;
aint[2*nod].llen=aint[2*nod+1].llen=0;
aint[2*nod].rlen=aint[2*nod+1].rlen=0;
lazy[2*nod]=1;
lazy[2*nod+1]=1;
lazy[nod]=0;
}
else if(lazy[nod]==2)
{
aint[2*nod].maxlen=aint[2*nod].llen=aint[2*nod].rlen=mid-st+1;
aint[2*nod+1].maxlen=aint[2*nod+1].llen=aint[2*nod+1].rlen=dr-mid;
lazy[2*nod]=2;
lazy[2*nod+1]=2;
lazy[nod]=0;
}
if(j<=mid) update(2*nod,st,mid,i,j,tip);
else if(i>mid) update(2*nod+1,mid+1,dr,i,j,tip);
else
{
update(2*nod,st,mid,i,mid,tip);
update(2*nod+1,mid+1,dr,mid+1,j,tip);
}
if(aint[2*nod].llen!=(mid-st+1)) aint[nod].llen=aint[2*nod].llen;
else aint[nod].llen=aint[2*nod].llen+aint[2*nod+1].llen;
if(aint[2*nod+1].rlen!=(dr-mid)) aint[nod].rlen=aint[2*nod+1].rlen;
else aint[nod].rlen=aint[2*nod].rlen+aint[2*nod+1].rlen;
aint[nod].maxlen=max(aint[2*nod].maxlen,aint[2*nod+1].maxlen);
aint[nod].maxlen=max(aint[nod].maxlen,aint[2*nod].rlen+aint[2*nod+1].llen);
///cout<<nod<<' '<<st<<' '<<dr<<' '<<' '<<aint[nod].llen<<' '<<aint[nod].maxlen<<' '<<aint[nod].rlen<<'\n';
return;
}
int main()
{
int n,p,c,j,m;
fin>>n>>p;
build(1,1,n);
for(int i=1;i<=p;i++)
{
fin>>c;
if(c==3)
{
fout<<aint[1].maxlen<<'\n';
}
else
{
if(c==1)
{
fin>>j>>m;
update(1,1,n,j,j+m-1,1);
///fout<<aint[1].maxlen<<'\n';
}
if(c==2)
{
fin>>j>>m;
update(1,1,n,j,j+m-1,2);
///fout<<aint[1].maxlen<<'\n';
}
}
}
return 0;
}