#include <stdio.h>
#define NMAX 100000
using namespace std;
struct str {
int max, left, right;
};
str arb[17 * NMAX] = { 0 };
int update[17 * NMAX] = { 0 };
int max(int a, int b) {
return (a > b) ? a : b;
}
void buildArb(int i, int j, int k=1) {
if (i == j) {
arb[k] = { 1,1,1 };
return;
}
int m = i + (j - i) / 2;
buildArb(i, m, 2 * k);
buildArb(m + 1, j, 2 * k + 1);
int size = j - i + 1;
arb[k] = { size,size,size };
}
void updateArb(int left, int right, int val, int i, int j, int k = 1) {
if (update[k] != 0) {
int size;
update[2 * k] = update[2 * k + 1] = update[k];
if (update[k] == -1)
size = j - i + 1;
else size = 0;
arb[k] = { size,size,size };
update[k] = 0;
}
if (i > right || j < left)return;
if (i >= left && j <= right) {
int size;
if (val == -1)
size = j - i + 1;
else size = 0;
arb[k] = { size,size,size };
update[2 * k] = update[2 * k + 1] = val;
return;
}
int m = i + (j - i) / 2;
updateArb(left, right, val, i, m, 2 * k);
updateArb(left, right, val, m + 1, j, 2 * k + 1);
str x = arb[2 * k], y = arb[2 * k + 1];
arb[k].max = max(max(x.max, y.max), x.right + y.left);
arb[k].left = (x.left == m - i + 1) ? x.left + y.left : x.left;
arb[k].right = (y.right == j - m) ? y.right + x.right : y.right;
}
int getMax() {
return arb[1].max;
}
int main()
{
FILE* fin, * fout;
fin=fopen("hotel.in", "r");
fout=fopen("hotel.out", "w");
int n, p;
fscanf(fin, "%i %i\n", &n, &p);
buildArb(1, n);
while (p--) {
int t;
fscanf(fin, "%i", &t);
if (t == 3)
fprintf(fout,"%i\n", getMax());
else {
int x, y;
fscanf(fin,"%i %i", &x, &y);
if (t == 1)
updateArb(x, x + y - 1, 1, 1, n);
else
updateArb(x, x + y - 1, -1, 1, n);
}
}
return 0;
}