#include <cstdio>
#include <algorithm>
#define NMax 500005
using namespace std;
struct ArbInt
{
int L, R, M, V;
int Length;
};
ArbInt AI[NMax];
int N;
inline void Build (int K, int L, int R)
{
int Mid=(L+R)/2;
AI[K].L=AI[K].R=AI[K].M=AI[K].Length=R-L+1;
AI[K].V=-1;
if (L<R)
{
Build (2*K, L, Mid);
Build (2*K+1, Mid+1, R);
}
}
inline void Update (int K, int L, int R, int UL, int UR, int V)
{
int Mid=(L+R)/2;
if (UL<=L and R<=UR)
{
AI[K].L=AI[K].R=AI[K].R=AI[K].Length*V;
AI[K].V=V;
return;
}
if (AI[K].V!=-1)
{
Update (2*K, L, Mid, L, Mid, AI[K].V);
Update (2*K+1, Mid+1, R, Mid+1, R, AI[K].V);
AI[K].V=-1;
}
if (UL<=Mid)
{
Update (2*K, L, Mid, UL, UR, V);
}
if (UR>Mid)
{
Update (2*K+1, Mid+1, R, UL, UR, V);
}
AI[K].M=max (max (AI[2*K].M, AI[2*K+1].M), AI[2*K].R+AI[2*K+1].L);
AI[K].L=AI[2*K].L;
if (AI[2*K].L==AI[2*K].Length)
{
AI[K].L+=AI[2*K+1].L;
}
AI[K].R=AI[2*K+1].R;
if (AI[2*K+1].R==AI[2*K+1].Length)
{
AI[K].R+=AI[2*K].R;
}
}
int main()
{
freopen ("hotel.in", "r", stdin);
freopen ("hotel.out", "w", stdout);
int NQ;
scanf ("%d %d", &N, &NQ);
Build (1, 1, N);
for (; NQ>0; --NQ)
{
int Type, X, Y;
scanf ("%d", &Type);
if (Type==3)
{
printf ("%d\n", AI[1].M);
continue;
}
scanf ("%d %d", &X, &Y);
Update (1, 1, N, X, X+Y-1, 1-Type%2);
}
return 0;
}