#include <fstream>
#define INTRA -1
#define IESE 1
const char IN [ ] = "hotel.in" ;
const char OUT [ ] = "hotel.out" ;
const int MAX = 100014 ;
using namespace std;
ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;
struct hotel {
int left , right , val ;
void sett ( int q )
{
left = right = val = q ;
}
};
hotel q [ 7 * MAX ] ;
int Cond [ 7 * MAX ] ;
inline void lazy ( int poz , int st , int dr )
{
if ( Cond [ poz ] )
{
if ( Cond [ poz ] == INTRA )
q [ poz ].sett ( 0 ) ;
if ( Cond [ poz ] == IESE )
q [ poz ].sett ( 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 and dr <= y )
{
Cond [ poz ] = val ;
lazy ( poz , st , dr ) ;
return ;
}
lazy ( poz , st , dr ) ;
int mij = ( st + dr ) >> 1 ;
if ( x <= mij )
UPDATE ( poz << 1 , st , mij , x , y ,val ) ;
if ( y > mij )
UPDATE ( poz << 1 | 1 , mij + 1 , dr , x , y , val ) ;
lazy ( poz << 1 , st , mij ) ;
lazy ( poz << 1 | 1, mij + 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 == mij - st + 1 ) ? ( q [ poz << 1 ].val + q [ poz << 1 | 1 ].left ) : ( q [ poz << 1 ].left ) ;
q [ poz ].right = ( q [ poz << 1 | 1 ].val == dr - mij ) ? ( q [ poz << 1 | 1 ].val + q [ poz << 1 ].right ) : ( q [ poz << 1 | 1 ].right ) ;
}
int main( )
{
int n , p , hasher = 0 ;
fin >> n >> p ;
Cond [ 1 ] = IESE ;
lazy ( 1 , 1 , n ) ;
for ( ; p ; -- p )
{
int z ;
fin >> z ;
if ( z == 1 ){
int x , y ;
fin >> x >> y ;
UPDATE ( 1 , 1 , n , x , x + y - 1 , INTRA ) ;
} else if ( z == 2 ) {
int x , y ;
fin >> x >> y ;
UPDATE ( 1 , 1 , n , x , x + y - 1 , IESE ) ;
} else if ( z == 3 ){
fout << q [ 1 ].val << '\n' ;
}
}
return hasher ;
}