//#define VDEBUG
#ifndef VDEBUG
#pragma options -3 -G -Z -r -O2
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef VDEBUG
#define VSQR 4
#define VSHF 2
int stat[VSQR], sfx[VSQR];
int xstat[VSQR][VSQR];
#else
#define VSQR (1<<17)
#define VSHF 7
//#define VSQR 32
//#define VSHF 5
char stat[VSQR], sfx[VSQR];
char xstat[1<<15][128];
#endif
int stl[VSQR], stm[VSQR], str[VSQR];
void upd_stat(int s) {
int x, mx, w;
// left
for(x = 0; x < VSQR && xstat[s][x]; x++)
;
if(x == VSQR) { stat[s] = 1; return; }
stl[s] = x;
// right
for(x = VSQR-1; xstat[s][x]; x--)
;
str[s] = VSQR-1 - x;
// middle
w = 0; mx = 0;
for(x = stl[s] + 1; x < VSQR; x++) {
if(xstat[s][x])
w++;
else {
if(mx < w) mx = w;
w = 0;
}
}
stm[s] = mx;
}
void update(int s, int e, int v) {
int sq, eq, pxs, pxe, sl, el;
int x;
sq = s >> VSHF; eq = e >> VSHF;
pxs = s & (VSQR-1); pxe = e & (VSQR-1);
if(sq == eq) {
if(sfx[sq]) { sfx[sq] = 0; memset(xstat[sq], stat[sq],
sizeof(xstat[sq])); }
if(!v && stat[sq]) { stat[sq] = 0; }
for(x = pxs; x <= pxe; x++)
xstat[sq][x] = v;
upd_stat(sq);
}
else {
sl = pxs ? sq + 1 : sq;
el = (pxe == VSQR-1) ? eq : eq - 1;
for(x = sl; x <= el; x++) {
stat[x] = v; stl[x] = stm[x] = str[x] = 0; sfx[x] = 1;
}
if(pxs) {
if(sfx[sq]) { sfx[sq] = 0; memset(xstat[sq], stat[sq],
sizeof(xstat[sq])); }
if(!v && stat[sq]) { stat[sq] = 0; }
for(x = pxs; x < VSQR; x++)
xstat[sq][x] = v;
upd_stat(sq);
}
if(pxe != VSQR-1) {
if(sfx[eq]) { sfx[eq] = 0; memset(xstat[eq], stat[eq],
sizeof(xstat[eq])); }
if(!v && stat[eq]) { stat[eq] = 0; }
for(x = 0; x <= pxe; x++)
xstat[eq][x] = v;
upd_stat(eq);
}
}
}
int query() {
int x;
int mx, w;
mx = 0;
w = 0;
for(x = 0; x < VSQR; x++) {
if(stat[x])
w += VSQR;
else {
w += stl[x];
if(w > mx) mx = w;
if(stm[x] > mx) mx = stm[x];
w = str[x];
}
}
if(w > mx) mx = w;
return mx;
}
void init(int n) {
memset(stat, 1, sizeof(stat));
memset(sfx, 1, sizeof(sfx));
update(n, VSQR*VSQR - 1, 0);
}
int main() {
FILE *fp, *fpo;
int c, cx, cy;
int n;
long l;
fp = fopen("hotel.in", "rt");
fpo = fopen("hotel.out", "wt");
fscanf(fp, "%d%ld", &n, &l);
init(n);
for(; l; l--) {
fscanf(fp, "%d", &c);
switch(c) {
case 1:
fscanf(fp, "%d%d", &cx, &cy);
cx--;
cy += cx - 1;
update(cx, cy, 0);
break;
case 2:
fscanf(fp, "%d%d", &cx, &cy);
cx--;
cy += cx - 1;
update(cx, cy, 1);
break;
case 3:
fprintf(fpo, "%d\n", query());
}
}
fclose(fpo);
fclose(fp);
return 0;
}