#include <cstdio>
#include <algorithm>
#define NMAX 100007
using namespace std;
FILE *fin, *fout;
int n, p, c, in, m, tip;
struct arbore
{
int sol;
int prefix;
int sufix;
} arb[3*NMAX];
void init(int st, int dr, int nod)
{
arb[nod].sol = dr -st + 1;
arb[nod].prefix = dr -st + 1;
arb[nod].sufix = dr -st + 1;
if(st == dr)return ;
int mij = (st+dr)/2;
init(st, mij, 2*nod);
init(mij+1, dr, 2*nod+1);
}
void pun(int st, int dr, int st1, int dr1, int nod)
{
if(st == st1 && dr == dr1)
{
if(c == 1) {arb[nod].sol = 0;arb[nod].prefix = 0;arb[nod].sufix = 0;}
if(c == 2) {arb[nod].sol = dr -st + 1;arb[nod].prefix = dr -st + 1;arb[nod].sufix = dr -st + 1;}
return ;
}
int Sfiu = 2*nod, Dfiu = 2*nod+1, mij = (st+dr) >>1, f = 1;
if(arb[nod].sol == 0)
{
arb[Sfiu].sol = 0;arb[Sfiu].prefix = 0;arb[Sfiu].sufix = 0;
arb[Dfiu].sol = 0;arb[Dfiu].prefix = 0;arb[Dfiu].sufix = 0;
}
if(arb[nod].sol == dr -st +1)
{
arb[Sfiu].sol = mij - st + 1;arb[Sfiu].prefix = mij - st + 1;arb[Sfiu].sufix = mij - st + 1;
arb[Dfiu].sol = dr - mij;arb[Dfiu].prefix = dr - mij;arb[Dfiu].sufix = dr - mij;
}
if(dr1 <= mij)
{
f = 0;
pun(st, mij, st1, dr1, Sfiu);
}
if(st1 > mij)
{
f = 0;
pun(mij+1, dr, st1, dr1, Dfiu);
}
if(f)
{
pun(st, mij, st1, mij, Sfiu);
pun(mij+1, dr, mij+1, dr1, Dfiu);
}
arb[nod].prefix = arb[Sfiu].prefix + ((arb[Sfiu].prefix == mij - st +1)? arb[Dfiu].prefix : 0);
arb[nod].sufix = arb[Dfiu].sufix + ((arb[Dfiu].sufix == dr - mij)? arb[Sfiu].sufix : 0);
arb[nod].sol = max(arb[Sfiu].sufix + arb[Dfiu].prefix, max(arb[Sfiu].sol, arb[Dfiu].sol));
}
int main()
{
fin = freopen("hotel.in", "r", stdin);
fout = freopen("hotel.out", "w", stdout);
scanf("%d%d", &n, &p);
init(1, n, 1);
for(int i = 1; i<= p; ++i)
{
scanf("%d", &c);
if(c < 3)
{
scanf("%d%d", &in, &m);
m+= in -1;
pun(1, n, in, m, 1);
}
if(c == 3)
{
printf("%d\n", arb[1].sol);
}
}
fclose(fin);
fclose(fout);
return 0;
}