#include <cstdio>
#include <algorithm>
using namespace std;
#define LMAX 262144
int N, Q, Op, A, B, ASt[LMAX], ADr[LMAX], ABest[LMAX];
inline void Build( int Nod, int St, int Dr )
{
ASt[Nod] = ADr[Nod] = ABest[Nod] = Dr - St + 1;
if( St == Dr ) return;
int M = St + ((Dr - St)>>1);
Build( (Nod<<1), St, M );
Build( ((Nod<<1)|1), M + 1, Dr );
}
inline void Update( int Nod, int St, int Dr, int AQ, int BQ, int Val )
{
if( AQ <= St && Dr <= BQ )
{
ASt[Nod] = ADr[Nod] = ABest[Nod] = (Dr - St + 1)*Val;
return;
}
int M = St + ((Dr - St)>>1);
if( ABest[Nod] == Dr - St + 1 )
{
ABest[(Nod<<1)] = ASt[(Nod<<1)] = ADr[(Nod<<1)] = M - St + 1;
ABest[((Nod<<1)|1)] = ASt[((Nod<<1)|1)] = ADr[((Nod<<1)|1)] = Dr - M;
}
else if( !ABest[Nod] )
ABest[(Nod<<1)] = ASt[(Nod<<1)] = ADr[(Nod<<1)] = ABest[((Nod<<1)|1)] = ASt[((Nod<<1)|1)] = ADr[((Nod<<1)|1)] = 0;
if( AQ <= M ) Update( (Nod<<1), St, M, AQ, BQ, Val );
if( BQ > M ) Update( ((Nod<<1)|1), M + 1, Dr, AQ, BQ, Val );
ASt[Nod] = ASt[(Nod<<1)];
if( ASt[Nod] == M - St + 1 ) ASt[Nod] += ASt[((Nod<<1)|1)];
ADr[Nod] = ADr[((Nod<<1)|1)];
if( ADr[Nod] == Dr - M ) ADr[Nod] += ADr[(Nod<<1)];
ABest[Nod] = max( max( ABest[(Nod<<1)], ABest[((Nod<<1)|1)] ), ADr[(Nod<<1)] + ASt[((Nod<<1)|1)] );
}
int main()
{
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%d%d", &N, &Q );
Build( 1, 1, N );
for( ; Q--; )
{
scanf("%d", &Op );
if( Op == 3 ) printf("%d\n", ABest[1] );
else
{
scanf("%d%d", &A, &B );
Update( 1, 1, N, A, A + B - 1, 1 - Op%2 );
}
}
return 0;
}