#include <stdio.h>
#define TMAX (1<<4)
#define l (nod<<1)
#define r (1+(nod<<1))
#define mij ( (p1+p2)>>1 )
int T[TMAX<<1], N, M, P, Q;
int St[TMAX<<1], Dr[TMAX<<1];
void up(int x)
{
int nod = x;
while (nod>1)
{
nod = nod>>1;
T[nod] = T[l]; St[nod] = St[l]; Dr[nod] = Dr[l];
if (T[nod]<T[r])
T[nod] = T[r], St[nod] = St[r], Dr[nod] = Dr[r];
if (Dr[l]==St[r]-1)
{
T[nod] = Dr[r]-St[l]+1;
St[nod] = St[l];
Dr[nod] = Dr[r];
}
}
}
void erase(int p1, int p2, int nod)
{
T[nod] = St[nod] = Dr[nod] = 0;
if (p1==p2) return;
erase(p1, mij, l);
erase(mij+1, p2, r);
}
void find(int p1, int p2, int nod, int q)
{
if (p1>p2) return;
if (P <= p1 && p2 <= Q)
{
if (q==2) T[nod] = p2-p1+1, St[nod] = p1, Dr[nod] = p2;
else erase(p1,p2,nod);
up(nod);
return;
}
if ( (p1 <= P && P <= p2) || (p1 <= Q && Q <= p2) )
{
find(p1, mij, l, q);
find(mij+1, p2, r, q);
}
}
int main()
{
int q;
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%d %d", &N, &M);
for (q = 0; q < N; q++) T[q+TMAX] = 1, St[q+TMAX] = Dr[q+TMAX] = q;
for (q = 0; q < N; q++) up(q+TMAX);
for (;M;--M)
{
scanf("%d", &q);
if (q == 3)
{ printf("%d\n", T[1]); continue; }
scanf("%d %d", &P, &Q);
P--;
Q = P+Q-1;
find(0,TMAX-1,1,q);
}
return 0;
}