#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int NMax = 400000, oo = -1e7;
int A[NMax + 5], B[NMax + 5], C[NMax + 5], S[NMax + 5], N, M, T[NMax + 5], AIT[NMax + 5];
void Make(int i)
{
S[i] = S[2 * i] + S[2 * i + 1];
if(S[i] <= 0) S[i] = oo;
A[i] = max(max(A[2 * i], S[2 * i] + A[2 * i + 1]), max(S[i], S[2 * i]));
if(A[i] <= 0) A[i] = oo;
B[i] = max(max(B[2 * i + 1], S[2 * i + 1] + B[2 * i]), max(S[2 * i + 1], S[i]));
if(B[i] <= 0) B[i] = oo;
C[i] = max(max(A[i], B[i]), max(B[2 * i], max(B[2 * i] + A[2 * i + 1], A[2 * i + 1])));
if(C[i] <= 0) C[i] = oo;
}
void Update(int i, int st, int dr, int a, int b, int v)
{
if(dr < a || b < st || st > dr) return;
if(a <= st && dr <= b)
{
AIT[i] += v, T[i] += v;
if(AIT[i] == 0)
A[i] = B[i] = C[i] = S[i] = dr - st + 1;
else
A[i] = B[i] = C[i] = S[i] = oo;
return;
}
if(st == dr) return;
int m = (st + dr) >> 1;
if(T[i] != 0)
{
Update(2 * i, st, m, st, m, T[i]);
Update(2 * i + 1, m + 1, dr, m + 1, dr, T[i]);
T[i] = 0;
}
Update(2 * i, st, m, a, b, v);
Update(2 * i + 1, m + 1, dr, a, b, v);
Make(i);
}
void Build(int i, int st, int dr)
{
A[i] = B[i] = S[i] = C[i] = dr - st + 1;
T[i] = 0;
if(st == dr) return;
int m = (st + dr) >> 1;
Build(2 * i, st, m);
Build(2 * i + 1, m + 1, dr);
}
int main()
{
fin >> N >> M;
Build(1, 1, N);
while(M--) {
int p, a, b; fin >> p;
if(p == 3)
fout << ((C[1] < 0) ? 0 : C[1]) << '\n';
else
{
fin >> a >> b;
if(p == 1)
Update(1, 1, N, a, b + a - 1, 1);
else
Update(1, 1, N, a, a + b - 1, -1);
}
}
fin.close();
fout.close();
return 0;
}