#include <bits/stdc++.h>
#define L first
#define R second
using namespace std;
int h[500000];
int l[500000];
int r[500000];
int val;
void update(int node, int L, int R, int A, int B) {
if(A <= L && R <= B) {
h[node] = (R - L + 1) * val;
l[node] = h[node];
r[node] = h[node];
return ;
}
int mij = (R - L) / 2 + L;
if(h[node] == R - L + 1) {
int k = mij - L + 1;
l[node * 2] = k;
r[node * 2] = k;
h[node * 2] = k;
k = R - mij;
l[node * 2 + 1] = k;
r[node * 2 + 1] = k;
h[node * 2 + 1] = k;
}
else if(h[node] == 0) {
l[node * 2] = r[node * 2] = h[node * 2] = 0;
l[node * 2 + 1] = r[node * 2 + 1] = h[node * 2 + 1] = 0;
}
if(A <= mij) update(node * 2, L, mij, A, B);
if(mij < B) update(node * 2 + 1, mij + 1, R, A, B);
l[node] = l[node * 2];
if(l[node * 2] == mij - L + 1) l[node] += l[node * 2 + 1];
r[node] = r[node * 2 + 1];
if(r[node * 2 + 1] == R - mij) r[node] += r[node * 2];
h[node] = max(h[node * 2], h[node * 2 + 1]);
h[node] = max(h[node], l[node * 2 + 1] + r[node * 2]);
}
int main()
{
FILE *f = fopen("hotel.in", "r");
FILE *g = fopen("hotel.out", "w");
int n, m;
fscanf(f, "%d %d", &n, &m);
val = 1;
update(1, 1, n, 1, n);
int tip, j, k;
for(int i = 1; i <= m; i ++) {
fscanf(f, "%d", &tip);
if(tip == 1) {
fscanf(f, "%d %d", &j, &k);
k += j - 1;
val = 0;
update(1, 1, n, j, k);
}
else if(tip == 2) {
fscanf(f, "%d %d", &j, &k);
k += j - 1;
val = 1;
update(1, 1, n, j, k);
}
else fprintf(g, "%d\n", h[1]);
}
return 0;
}