#include <cstdio>
#define maxN 100100
struct arbint {
int l, r, libere;
} Arb[maxN * 4 + 100];
int N, start, finish;
inline int max (int a, int b) {
if (a > b) return a;
return b;
}
void baga_marfa (int nod, int l, int r) {
int NrLibere, mid, st = 2 * nod, dr = 2 * nod + 1;
if (start <= l && r <= finish) {
NrLibere = (r - l + 1);
Arb[nod].l = Arb[nod].r = Arb[nod].libere = 0;
return ;
}
mid = (l + r) >> 1;
if (Arb[nod].libere = (r - l + 1)) {
Arb[st].libere = Arb[st].l = Arb[st].r = (mid - l + 1);
Arb[dr].libere = Arb[dr].l = Arb[dr].r = (r - mid);
}
if (start <= mid)
baga_marfa(st, l, mid);
if (mid < finish)
baga_marfa(dr, mid + 1, r);
Arb[nod].libere = max (max(Arb[st].libere, Arb[dr].libere), Arb[st].r + Arb[dr].l);
if (Arb[st].l == (mid - l + 1))
Arb[nod].l = (mid - l + 1) + Arb[dr].l;
else
Arb[nod].l = Arb[st].l;
if (Arb[dr].r == (r - mid))
Arb[nod].r = (r - mid) + Arb[st].r;
else
Arb[nod].r = Arb[dr].r;
}
void scoate_marfa (int nod, int l, int r) {
int NrLibere, mid, st = 2 * nod, dr = 2 * nod + 1;
// printf("Arb %d %d %d %d %d %d\n", nod, l, r, Arb[nod].libere, Arb[nod].l, Arb[nod].r);
if (start <= l && r <= finish) {
NrLibere = (r - l + 1);
Arb[nod].l = Arb[nod].r = Arb[nod].libere = NrLibere;
return ;
}
mid = (l + r) >> 1;
if (Arb[nod].libere == 0) {
Arb[st].libere = Arb[st].l = Arb[st].r = 0;
Arb[dr].libere = Arb[dr].l = Arb[dr].r = 0;
}
if (start <= mid)
scoate_marfa(st, l, mid);
if (mid < finish)
scoate_marfa(dr, mid + 1, r);
Arb[nod].libere = max (max(Arb[st].libere, Arb[dr].libere), Arb[st].r + Arb[dr].l);
if (Arb[st].l == (mid - l + 1))
Arb[nod].l = (mid - l + 1) + Arb[dr].l;
else
Arb[nod].l = Arb[st].l;
if (Arb[dr].r == (r - mid))
Arb[nod].r = (r - mid) + Arb[st].r;
else
Arb[nod].r = Arb[dr].r;
}
void construieste (int nod ,int l, int r) {
if (l == r) {
Arb[nod].l = Arb[nod].r = Arb[nod].libere = 1;
return ;
}
int mid, st, dr;
mid = (l + r) >> 1; st = nod * 2, dr = nod * 2 + 1;
construieste(st, l, mid);
construieste(dr, mid + 1, r);
Arb[nod].l = Arb[nod].r = Arb[nod].libere = Arb[st].l + Arb[dr].l;
}
int main () {
int M, tip;
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%d%d", &N, &M);
construieste (1, 1, N);
for ( ; M ; M --) {
scanf("%d", &tip);
if (tip == 3) {
printf("%d\n", Arb[1].libere);
continue;
}
scanf("%d%d", &start, &finish);
finish += start - 1;
if (tip == 1)
baga_marfa(1, 1, N);
else
scoate_marfa(1, 1, N);
// printf("%d %d %d\n", Arb[1].libere, Arb[1].l, Arb[1].r);
// printf("%d %d %d %d %d %d\n",Arb[2].libere, Arb[2].l, Arb[2].r, Arb[3].libere, Arb[3].l, Arb[3].r);
}
}