# include <fstream>
# include <iostream>
# include <iomanip>
# define max(a,b) a>b?a:b
# define min(a,b) a<b?a:b
using namespace std;
struct nod{
int l, r, c, v;
};
int n, p;
nod v[1000000];
void mars (int st, int dr, int k)
{
int mij=(st+dr)/2;
v[k].v=1;
if (st==dr)
return;
mars (st, mij, 2*k);
mars (mij+1, dr, 2*k+1);
}
void mod (int st, int dr, int I, int J, int k, int val, int plin)
{
int mij=(I+J)/2, pl;
v[k].v=1;
if (st==I && dr==J)
{
v[k].l=v[k].r=v[k].c=val;
if (val)
mars(I,J, k);
v[k].v=1;
}
else
{
if (v[k].c==0)pl=0;
else pl=1;
if (st<=mij && dr>mij)
{
mod(mij+1, dr, mij+1, J, 2*k+1, min(val,dr-mij), pl);
}
else if (st<=mij && dr<=mij)
{
mod(st, dr, I, mij, 2*k, val, pl);
}
else if (st>mij && dr>mij)
{
mod(st, dr, mij+1, J, 2*k+1, val, pl);
}
if (v[2*k].v==0) v[2*k].l = v[2*k].c = v[2*k].r = mij-I+1;
if (v[2*k+1].v==0) v[2*k+1].l = v[2*k+1].c = v[2*k+1].r = J-mij;
v[k].l=v[2*k].l;
v[k].r=v[2*k+1].r;
v[k].c=max(v[2*k].c,v[2*k+1].c);
if (v[2*k].l==mij-I+1) v[k].l += v[2*k+1].l;
if (v[2*k+1].r==J-mij) v[k].r += v[2*k].r;
v[k].c = max (v[k].c, v[2*k].r+v[2*k+1].l);
v[k].c = max (v[k].c, (max (v[k].l, v[k].r)));
}
}
int main()
{
ifstream fin ("hotel.in");
freopen("hotel.out", "w", stdout);
fin>>n>>p;
v[1].l=v[1].r=v[1].c=v[1].v=n;
for(;p--;)
{
int c, i, m;
fin>>c;
if (c==1)
{
fin>>i>>m;
mod(i, i+m-1, 1, n, 1, 0, -1);
}
if (c==2)
{
fin>>i>>m;
mod(i, i+m-1, 1, n, 1, m, -1);
}
if (c==3)
printf("%d\n", v[1].c);
}
return 0;
}