#include<bits/stdc++.h>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
struct Nod
{
int max_lib,st_lib,dr_lib,tot_lib;
};
Nod arb[400005];
int n;
void combina(int nod,int st,int dr)
{
int mij=(st+dr)/2,st_fiu=2*nod,dr_fiu=2*nod+1;
arb[nod].st_lib=arb[st_fiu].st_lib;
arb[nod].dr_lib=arb[dr_fiu].dr_lib;
if(arb[st_fiu].tot_lib==mij-st+1)
arb[nod].st_lib+=arb[dr_fiu].st_lib;
if(arb[dr_fiu].tot_lib==dr-mij)
arb[nod].dr_lib+=arb[st_fiu].dr_lib;
arb[nod].tot_lib=arb[st_fiu].tot_lib+arb[dr_fiu].tot_lib;
arb[nod].max_lib=max({arb[st_fiu].max_lib,arb[dr_fiu].max_lib,arb[st_fiu].dr_lib+arb[dr_fiu].st_lib});
}
void construieste(int nod,int st,int dr)
{
if(st==dr)
arb[nod]={1,1,1,1};
else
{
int mij=(st+dr)/2;
construieste(2*nod,st,mij);
construieste(2*nod+1,mij+1,dr);
combina(nod,st,dr);
}
}
void actualizeaza(int nod,int st,int dr,int l,int r,int val)
{
if(st>dr||st>r||dr<l) return;
if(st==dr)
arb[nod]={val,val,val,val};
else
{
int mij=(st+dr)/2;
actualizeaza(2*nod,st,mij,l,r,val);
actualizeaza(2*nod+1,mij+1,dr,l,r,val);
combina(nod,st,dr);
}
}
void ocupa(int l,int r)
{
actualizeaza(1,0,n-1,l,r,0);
}
void elibereaza(int l,int r)
{
actualizeaza(1,0,n-1,l,r,1);
}
int maxSegmentLiber()
{
return arb[1].max_lib;
}
int main()
{
int p;
in>>n>>p;
construieste(1,0,n-1);
int rez[100005],nrRez=0;
for(int i=0;i<p;i++)
{
int com;
in>>com;
if(com==1)
{
int i,m;
in>>i>>m;
ocupa(i-1,i+m-2);
}
else if(com==2)
{
int i,m;
in>>i>>m;
elibereaza(i-1,i+m-2);
}
else if(com==3)
rez[nrRez++]=maxSegmentLiber();
}
for(int i=0;i<nrRez;i++)
out<<rez[i]<<"\n";
return 0;
}