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