#include <fstream>
#define NMAX 100005
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int N,P,lazy[4*NMAX];
struct node
{
int pref,suff,best,len;
} aint[4*NMAX];
node combine(node L, node R)
{
node T;
T.len=L.len+R.len;
T.best=max(max(L.best,R.best),L.suff+R.pref);
if(L.pref==L.len)
{
T.pref=L.len+R.pref;
}
else
{
T.pref=L.pref;
}
if(R.suff==R.len)
{
T.suff=L.suff+R.len;
}
else
{
T.suff=R.suff;
}
return T;
}
void modificare(int nod, int val)
{
if(!val)
{
aint[nod].pref=aint[nod].suff=aint[nod].best=0;
}
else
{
aint[nod].pref=aint[nod].suff=aint[nod].best=aint[nod].len;
}
lazy[nod]=val;
}
void propagate(int nod)
{
if(lazy[nod]!=-1)
{
modificare(2*nod,lazy[nod]);
modificare(2*nod+1,lazy[nod]);
lazy[nod]=-1;
}
}
void build(int nod, int st, int dr)
{
lazy[nod]=-1;
aint[nod].len=dr-st+1;
if(st==dr)
{
aint[nod].pref=aint[nod].suff=aint[nod].best=1;
return;
}
int pmijl=(st+dr)/2;
build(2*nod,st,pmijl);
build(2*nod+1,pmijl+1,dr);
aint[nod]=combine(aint[2*nod],aint[2*nod+1]);
}
void update(int nod, int st, int dr, int l, int r, int val)
{
if(st>r || dr<l)
{
return;
}
if(l<=st && dr<=r)
{
modificare(nod,val);
return;
}
propagate(nod);
int pmijl=(st+dr)/2;
update(2*nod,st,pmijl,l,r,val);
update(2*nod+1,pmijl+1,dr,l,r,val);
aint[nod]=combine(aint[2*nod],aint[2*nod+1]);
}
int main()
{
fin>>N>>P;
build(1,1,N);
int op,poz,M;
for(int q=1; q<=P; q++)
{
fin>>op;
if(op==1)
{
fin>>poz>>M;
update(1,1,N,poz,poz+M-1,0);
}
if(op==2)
{
fin>>poz>>M;
update(1,1,N,poz,poz+M-1,1);
}
if(op==3)
{
fout<< aint[1].best << "\n";
}
}
return 0;
}