#include <stdio.h>
#define MAXNOD 262144
int arbst[MAXNOD + 1], arbdr[MAXNOD + 1], arbmax[MAXNOD + 1], a, b;
int max2(int a, int b){
return a > b ? a : b;
}
int max3(int a, int b, int c){
return max2(max2(a, b), c);
}
void init(int p, int st, int dr){
arbst[p] = arbdr[p] = arbmax[p] = dr - st + 1;
if(st != dr){
int m = (st + dr) / 2;
init(2 * p, st, m);
init(2 * p + 1, m + 1, dr);
}
}
void update(int p, int st, int dr, char tip, char sus){
if(st >= a && dr <= b){
if(tip == 0)
arbst[p] = arbdr[p] = arbmax[p] = 0;
else
arbst[p] = arbdr[p] = arbmax[p] = dr - st + 1;
}
else{
if(sus == 2){
if(arbmax[p] == 0)
sus = 1;
if(arbmax[p] == dr - st + 1)
sus = 0;
}
int m = (st + dr) / 2;
char g = 0, h = 0;
if(b > m && a <= dr){
update(2 * p + 1, m + 1, dr, tip, sus);
h = 1;
}
if(a <= m && b >= st){
update(2 * p, st, m, tip, sus);
g = 1;
}
if(!g){
if(sus == 0)
arbst[2 * p] = arbdr[2 * p] = arbmax[2 * p] = m - st + 1;
if(sus == 1)
arbst[2 * p] = arbdr[2 * p] = arbmax[2 * p] = 0;
}
if(!h){
if(sus == 0)
arbst[2 * p + 1] = arbdr[2 * p + 1] = arbmax[2 * p + 1] = dr - m;
if(sus == 1)
arbst[2 * p + 1] = arbdr[2 * p + 1] = arbmax[2 * p + 1] = 0;
}
arbst[p] = arbst[2 * p];
if(arbst[2 * p] == m - st + 1)
arbst[p] += arbst[2 * p + 1];
arbdr[p] = arbdr[2 * p + 1];
if(arbdr[2 * p + 1] == dr - m)
arbdr[p] += arbdr[2 * p];
arbmax[p] = max3(arbmax[2 * p], arbmax[2 * p + 1], arbdr[2 * p] + arbst[2 * p + 1]);
}
}
int main(){
FILE *in = fopen("hotel.in", "r");
FILE *out = fopen("hotel.out", "w");
int n, p, i, t;
char up[3] = {0, 0, 1};
fscanf(in, "%d%d", &n, &p);
init(1, 1, n);
for(i = 0; i < p; i++){
fscanf(in, "%d", &t);
if(t == 1 || t == 2){
fscanf(in, "%d%d", &a, &b);
b += a - 1;
update(1, 1, n, up[t], 2);
}
else
fprintf(out, "%d\n", arbmax[1]);
}
fclose(in);
fclose(out);
return 0;
}