#include <iostream>
#include <fstream>
#define nmx 100005
using namespace std;
int n,c,pz,nr,p,arb[4*nmx],starb[4*nmx],drarb[4*nmx],lzset[4*nmx];
void build(int st,int dr,int index)
{
if (st==dr)
{
arb[index]=starb[index]=drarb[index]=1;
return;
}
int mid=(st+dr)/2;
build(st,mid,index*2);
build(mid+1,dr,index*2+1);
arb[index]=starb[index]=drarb[index]=dr-st+1;
}
void lazy(int st,int dr,int index)
{
if (lzset[index]==1)
{
arb[index]=starb[index]=drarb[index]=0;
if (st!=dr)
lzset[index*2]=lzset[index*2+1]=1;
}
else if (lzset[index]==2)
{
arb[index]=starb[index]=drarb[index]=dr-st+1;
if (st!=dr)
lzset[index*2]=lzset[index*2+1]=2;
}
lzset[index]=0;
}
void update(int st,int dr,int a,int b,int index,int val)
{
lazy(st,dr,index);
if (st>b || dr<a)
return;
if (a<=st && dr<=b)
{
lzset[index]=val;
lazy(st,dr,index);
return;
}
int mid=(st+dr)/2;
update(st,mid,a,b,index*2,val);
update(mid+1,dr,a,b,index*2+1,val);
arb[index]=max(arb[index*2],max(arb[index*2+1],drarb[index*2]+starb[index*2+1]));
if (mid-st+1==starb[index*2])
starb[index]=starb[index*2]+starb[index*2+1];
else starb[index]=starb[index*2];
if (dr-mid==drarb[index*2+1])
drarb[index]=drarb[index*2]+drarb[index*2+1];
else drarb[index]=drarb[index*2+1];
}
int main()
{
ifstream f ("hotel.in");
ofstream g ("hotel.out");
f>>n>>p;
build(1,n,1);
update(1,n,1,n,1,2);
for (int i=1; i<=p; i++)
{
f>>c;
if (c==1)
{
f>>pz>>nr;
update(1,n,pz,pz+nr-1,1,1);
}
if (c==2)
{
f>>pz>>nr;
update(1,n,pz,pz+nr-1,1,2);
}
if (c==3)
{
g<<arb[1]<<'\n';
}
}
}