Pagini recente » Cod sursa (job #643053) | Cod sursa (job #2425483) | Cod sursa (job #856776) | Cod sursa (job #1477879) | Cod sursa (job #2816631)
// Mihai Priboi
#include <stdio.h>
#include <algorithm>
#define MAXN 100000
#define SQRTN 316
int v[MAXN];
int batog[SQRTN + 1];
int nr_int, int_size;
void construct( int n ) {
int i, j, max;
int_size = 1;
while( int_size * int_size <= n )
int_size++;
int_size--;
nr_int = int_size;
if( nr_int * int_size < n )
nr_int++;
for( i = 0; i < nr_int; i++ ) {
max = 0;
for( j = i * int_size; j < (i + 1) * int_size && j < n; j++ )
max = std::max( max, v[j] );
batog[i] = max;
}
}
int getMax( int a, int b ) {
int max, i, j;
max = 0;
j = a;
i = j / int_size;
if( j > i * int_size ) {
i++;
for( ; j < i * int_size; j++ )
max = std::max( max, v[j] );
}
while( b >= (i + 1) * int_size - 1 ) {
max = std::max( max, batog[i] );
i++;
}
for( j = i * int_size; j <= b; j++ )
max = std::max( max, v[j] );
return max;
}
void update( int pos, int val ) {
int i, j, max;
i = pos / int_size;
if( val > batog[i] )
batog[i] = val;
else if( v[pos] == batog[i] ) {
v[pos] = val;
max = 0;
for( j = i * int_size; j < (i + 1) * int_size; j++ )
max = std::max( max, v[j] );
batog[i] = max;
}
v[pos] = val;
}
int main() {
FILE *fin, *fout;
int n, m, i, a, b, op;
fin = fopen( "arbint.in", "r" );
fscanf( fin, "%d%d", &n, &m );
for( i = 0; i < n; i++ )
fscanf( fin, "%d", &v[i] );
construct(n);
fout = fopen( "arbint.out", "w" );
for( i = 0; i < m; i++ ) {
fscanf( fin, "%d%d%d", &op, &a, &b );
if( op == 0 )
fprintf( fout, "%d\n", getMax(a - 1, b - 1) );
else
update(a - 1, b);
}
fclose( fin );
fclose( fout );
return 0;
}