#include <fstream>
#include <algorithm>
const int INTRA= -1, IESE= 1, NMAX= 100000;
using namespace std;
ifstream in( "hotel.in" );
ofstream out( "hotel.out" );
struct HOTEL {
int left, right, val;
void init( int q ) {
left = right = val = q;
}
} q[ 7 * NMAX+ 1 ];
int Cond[ 7 * NMAX + 1 ];
void LAZY( int poz, int st, int dr ) {
if ( Cond [ poz ] ) {
if ( Cond [ poz ] == INTRA ) {
q [ poz ].init( 0 ) ;
}
if ( Cond [ poz ] == IESE ) {
q [ poz ].init( dr - st + 1 ) ;
}
if ( st != dr ) {
Cond [ poz << 1 ]= Cond [ poz << 1 | 1 ] = Cond [ poz ] ;
}
Cond [ poz ] = 0 ;
}
}
void UPDATE ( int poz , int st ,int dr , int x , int y , int val ) {
if ( x <= st && dr <= y ) {
Cond [ poz ] = val ;
LAZY( poz , st , dr ) ;
return ;
}
LAZY( poz , st , dr ) ;
int mid= ( st + dr ) / 2;
if ( x <= mid ) {
UPDATE ( poz << 1 , st , mid , x , y ,val );
}
if ( y > mid ) {
UPDATE ( poz << 1 | 1 , mid + 1 , dr , x , y , val );
}
LAZY( poz << 1 , st , mid ) ;
LAZY( poz << 1 | 1, mid + 1 , dr ) ;
q [ poz ].val = max ( max ( q [ poz << 1 ].val , q [ poz << 1 | 1 ].val ) , q [ poz << 1 ].right + q [ poz << 1 | 1 ].left );
q [ poz ].left = ( q [ poz << 1 ].val == mid - st + 1 ) ? ( q [ poz << 1 ].val + q [ poz << 1 | 1 ].left ) : ( q [ poz << 1 ].left );
q [ poz ].right = ( q [ poz << 1 | 1 ].val == dr - mid ) ? ( q [ poz << 1 | 1 ].val + q [ poz << 1 ].right ) : ( q [ poz << 1 | 1 ].right );
}
int main( ) {
int N , Q;
in >> N >> Q;
Cond[1]= IESE;
LAZY( 1 , 1 , N );
for ( int t= 1; t<=Q; ++t ) {
int f;
in >> f;
if ( f == 1 ) {
int x , y ;
in >> x >> y ;
UPDATE ( 1 , 1 , N , x , x + y - 1 , INTRA ) ;
} else if ( f == 2 ) {
int x , y ;
in >> x >> y ;
UPDATE ( 1 , 1 , N , x , x + y - 1 , IESE ) ;
} else if ( f == 3 ) {
int aux= 1;
out << q[aux].val << '\n' ;
}
}
return 0;
}