#include<fstream>
using namespace std;
struct cell
{
int dr,st;
int best;
int ok;
};
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int NMAX=100005;
int n,p;
cell aint[8*NMAX];
inline void CreateAint(int nod,int stanga,int dreapta)
{
if (stanga==dreapta)
aint[nod].best=aint[nod].st=aint[nod].dr=dreapta-stanga+1;
else
{
int mij=(stanga+dreapta)>>1;
CreateAint(2*nod,stanga,mij);
CreateAint(2*nod+1,mij+1,dreapta);
aint[nod].best=aint[nod].st=aint[nod].dr=dreapta-stanga+1;
}
}
inline void DOWN(int poz,int dreapta,int stanga)
{
if (aint[poz].ok==1) {aint[poz].best=aint[poz].st=aint[poz].dr=0;aint[2*poz].ok=aint[2*poz+1].ok=1;}
if (aint[poz].ok==0) {aint[poz].best=aint[poz].st=aint[poz].dr=dreapta-stanga+1;aint[2*poz].ok=aint[2*poz+1].ok=0;}
}
inline void UPDATE(int nod,int stanga,int dreapta,int a,int b,int c)
{
if (a<=stanga && dreapta<=b)
{
//fout<<"stanga="<<stanga<<" "<<"dreapta="<<nod<<"\n";
if (c==1)
{aint[nod].ok=1;aint[nod].best=aint[nod].st=aint[nod].dr=0;}
else
{aint[nod].ok=0;aint[nod].best=aint[nod].st=aint[nod].dr=dreapta-stanga+1;}
}
else
{
int mij=(stanga+dreapta)>>1;
DOWN(nod,dreapta,stanga);
if (a<=mij) UPDATE(2*nod,stanga,mij,a,b,c);
if (b>mij) UPDATE(2*nod+1,mij+1,dreapta,a,b,c);
DOWN(2*nod,mij,stanga);
DOWN(2*nod+1,dreapta,mij+1);
aint[nod].dr=aint[2*nod+1].dr;
if (aint[2*nod+1].best==dreapta-mij) aint[nod].dr+=aint[2*nod].dr;
aint[nod].st=aint[2*nod].st;
if (aint[2*nod].best==mij-stanga+1) aint[nod].st+=aint[2*nod+1].st;
aint[nod].best=max(aint[2*nod].best,max(aint[2*nod+1].best,aint[2*nod].dr+aint[2*nod+1].st));
aint[nod].ok=2;
if (aint[nod].best==0) aint[nod].ok=1;
if (aint[nod].best==dreapta-stanga+1) aint[nod].ok=0;
}
}
inline int QUERY(int nod,int stanga,int dreapta)
{
return aint[nod].best;
}
inline void SOLVE()
{
int i,c,poz,m;
for (i=1;i<=p;i++)
{
fin>>c;
if (c!=3) {fin>>poz>>m;UPDATE(1,1,n,poz,poz+m-1,c);}
else fout<<QUERY(1,1,n)<<"\n";
}
}
int main()
{
fin>>n>>p;
CreateAint(1,1,n);
SOLVE();
// for (int i=1;i<=30;i++) fout<<aint[i].st<<" "<<aint[i].best<<" "<<aint[i].dr<<" "<<aint[i].ok<<"\n";
return 0;
}