#include <cstdio>
#define MAX 100000
#define maxi(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
struct Node{
int st, dr, c, val;
} x[50*MAX];
int sol, n, v;
int Maximum(int a, int b, int c, int d, int f)
{
int aux = maxi(a, b);
int aux2 = maxi(c, d);
aux = maxi(aux, f);
aux = maxi(aux, aux2);
return aux;
}
FILE * fout = fopen("hotel.out", "w");
void Update(int nod, int l, int r, int a, int b);
int main()
{
int i, q, op, x1, x2, m;
FILE * fin = fopen("hotel.in", "r");
fscanf(fin, "%d %d", &n, &m);
for (i = 1; i <= n; i++)
{
v = 1;
Update(1, 1, n, i, i);
}
for (q = 1; q <= m; q++)
{
fscanf(fin, "%d ", &op);
if (op != 3)
{
fscanf(fin, "%d %d", &x1, &x2);
if (op == 1) { v = 0; Update(1, 1, n, x1, x1+x2-1); }
else { v = 1; Update(1, 1, n, x1, x1+x2-1); }
}
else fprintf(fout, "%d\n", x[1].val);
}
fclose(fin);
fclose(fout);
return 0;
}
void Update(int nod, int l, int r, int a, int b)
{
if (l == r)
{
x[nod].st = x[nod].dr = x[nod].c = x[nod].val = v;
return;
}
int mijl = (l+r)/2;
if (a <= mijl) Update(2*nod, l, mijl, a, b);
if (mijl < b) Update(2*nod+1, mijl+1, r, a, b);
int l1 = mijl-l+1, l2 = r-mijl;
int ns = 2*nod, nd = 2*nod+1;
if (x[ns].st == l1) x[nod].st = x[ns].st + x[nd].st;
else x[nod].st = x[ns].st;
if (x[nd].dr == l2) x[nod].dr = x[nd].dr + x[ns].dr;
else x[nod].dr = x[nd].dr;
x[nod].c = x[ns].dr + x[nd].st;
x[nod].val = Maximum(x[nod].st, x[nod].dr, x[nod].c, x[ns].val, x[nd].val);
}