Pagini recente » Borderou de evaluare (job #2393057) | Cod sursa (job #351222) | Borderou de evaluare (job #2912159) | Cod sursa (job #3236681) | Cod sursa (job #1150999)
//arbint- BATOG
#include <cstdio>
#include <cmath>
#define MAXN 100000
int v[MAXN], bucati[500];
int main () {
FILE *f, *g;
f = fopen( "arbint.in", "r" );
g = fopen( "arbint.out", "w" );
int n, m, rad, max, stop, a, b, tip, ba, bb, start;
fscanf( f, "%d%d", &n, &m );
for( int i = 0 ; i < n ; ++i )
fscanf( f, "%d", &v[i] );
rad = sqrt( n );
for( int i = 0, buc = 0 ; i < n ; i += rad, ++buc ) {
max = -1;
stop = i + rad - 1;
if( stop >= n )
stop = n;
for( int j = i ; j <= stop ; ++j )
if( v[j] > max )
max = v[j];
bucati[buc] = max;
}
for( int i = 0 ; i < m ; ++i ) {
fscanf( f, "%d%d%d", &tip, &a, &b );
--a;
--b;
if( tip == 1 ) {
++b;
v[a] = b;
max = -1;
ba = a / rad;
for( int j = ba * rad ; j < (ba+1) * rad ; ++j )
if( v[j] > max )
max = v[j];
bucati[ba] = max;
}
else {
max = -1;
ba = a / rad;
bb = b / rad;
for( int j = ba + 1 ; j < bb ; ++j ) //buvata a : (ba-1) * rad... ba*rad - 1
if( bucati[j] > max )
max = bucati[j];
stop = (ba+1) * rad - 1;
if( stop > b )
stop = b;
for( int j = a ; j <= stop ; ++j )
if( v[j] > max )
max = v[j];
start = bb * rad;
if( start < a )
start = a;
for( int j = start ; j <= b ; ++j )
if( v[j] > max )
max = v[j];
fprintf( g, "%d\n", max );
}
}
fclose( f );
fclose( g );
return 0;
}