Pagini recente » Cod sursa (job #761156) | Cod sursa (job #404419) | Cod sursa (job #2128481) | Cod sursa (job #767674) | Cod sursa (job #1215739)
#include <fstream>
#define rint register int
#define max(a,b) ((a>b)?(a):(b))
const char IN [ ] = "arbint.in" ;
const char OUT [ ] = "arbint.out" ;
const int MAX = 101414 ;
using namespace std;
ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;
int v [ 4 * MAX ] , n , val , pos , maxim , start , finish ;
void updt ( int nod , int st , int dr );
void query ( int nod , int st , int dr );
int main( )
{
int m ;
fin >> n >> m ;
for ( rint i = 1 ; i <= n ; ++ i )
{
fin >> val ;
pos = i ;
updt ( 1 , 1 , n ) ;
}
while ( m -- )
{
int x , a , b ;
fin >> x >> a >> b ;
if ( ! x )
{
maxim = - 14 ;
start = a ;
finish = b ;
query( 1 , 1 , n ) ;
fout << maxim << '\n' ;
}
else
{
val = b ;
pos = a ;
updt( 1 , 1 , n );
}
}
return 0;
}
void updt ( int nod , int st , int dr )
{
if ( st == dr )
{
v [ nod ] = val ;
return ;
}
int mij = ( st + dr ) >> 1 ;
if ( pos <= mij )
updt ( ( nod << 1 ) , st , mij ) ;
else updt ( ( nod << 1 ) + 1 , mij + 1 , dr ) ;
v [ nod ] = max ( v [ ( nod << 1 ) ], v [ ( nod << 1 ) + 1 ] ) ;
}
void query ( int nod , int st , int dr )
{
if( start <= st and dr <= finish )
{
maxim = max ( maxim , v [ nod ] );
return ;
}
int mij = ( st + dr ) >> 1 ;
if ( start <= mij )
query ( ( nod << 1 ) , st , mij );
if ( mij < finish )
query ( ( nod << 1 ) + 1, mij + 1 , dr ) ;
}