#include <fstream>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
long L[400005],n,i,j,p,t,pos,nr;
struct ab{
long val,st,dr;
}v[400005];
void propagare(long nod,long st,long dr)
{
long mij=(st+dr)/2;
if (L[nod]==1)
{
L[nod]=0;
L[nod*2+1]=L[nod*2]=1;
v[nod*2+1].val=v[nod*2+1].st=v[nod*2+1].dr=dr-mij;
v[nod*2].val=v[nod*2].st=v[nod*2].dr=mij-st+1;
}
else if (L[nod]==-1)
{
L[nod]=0;
L[nod*2+1]=L[nod*2]=-1;
v[nod*2+1].val=v[nod*2+1].st=v[nod*2+1].dr=0;
v[nod*2].val=v[nod*2].st=v[nod*2].dr=0;
}
}
ab update1(long nod,long st,long dr,long x,long y,long type)
{
if (x<=st && dr<=y)
{
ab emp;
if (type==1)
{
L[nod]=1;
v[nod].val=dr-st+1;
v[nod].st=v[nod].dr=dr-st+1;
emp.val=emp.st=emp.dr=dr-st+1;
}
else
{
L[nod]=-1;
v[nod].val=0;
v[nod].st=v[nod].dr=0;
emp.val=emp.st=emp.dr=0;
}
return emp;
}
else
{
ab r1,r2;
long mij=(st+dr)/2,mx;
propagare(nod,st,dr);
r1=v[nod*2];
r2=v[nod*2+1];
if (x<=mij)
r1=update1(nod*2,st,mij,x,y,type);
if (mij+1<=y)
r2=update1(nod*2+1,mij+1,dr,x,y,type);
mx=max(r2.val,r1.val);
ab emp;
if (r2.st+r1.dr>mx)
mx=r2.st+r1.dr;
emp.val=mx;
emp.st=r1.st;
emp.dr=r2.dr;
if (r1.val==mij-st+1)
emp.st=r1.val+r2.st;
if (r2.val==dr-mij)
emp.dr=r1.dr+r2.val;
v[nod]=emp;
return emp;
}
}
int main()
{
f>>n>>p;
update1(1,1,n,1,n,1);
for (i=1;i<=p;i++)
{
f>>t;
if (t==3)
g<<v[1].val<<'\n';
else
{
f>>pos>>nr;
if (t==1)
update1(1,1,n,pos,pos+nr-1,2);
else
update1(1,1,n,pos,pos+nr-1,1);
}
}
return 0;
}