Pagini recente » Cod sursa (job #2950653) | Cod sursa (job #280185) | Cod sursa (job #2216420) | Cod sursa (job #1960814) | Cod sursa (job #2947742)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
const int NMAX = 100000;
int radical, n;
int v[NMAX+1], batog[320];
int getblock( int a ){
return a / radical;
}
int maxim( int st, int dr){
int a = getblock( st ) , b = getblock( dr ) , maxi = 0 , j;
if( a == b ){
for( j = st ; j <= dr ; j++)
maxi = max(maxi, v[j]);
}
else{
int fin = min( radical * ( a + 1 ) , n);
for( j = st ; j < fin ; j++ )
maxi = max( maxi , v[j]);
for( j = a + 1 ; j < b ; j++ )
maxi = max( maxi, batog[j]);
for( j = dr ; j >= radical * b; j-- )
maxi = max( maxi, v[j]);
}
return maxi;
}
void inlocuire( int poz, int val){
int st = getblock( poz ) , maxi = 0 , j;
int fin = min( radical * ( st + 1 ) , n);
v[poz] = val;
for( j = radical * st ; j < fin; j++ )
batog[st] = max( maxi , v[j]);
}
int main()
{
ifstream in("arbint.in");
ofstream out("arbint.out");
int m, a, b, i, cer;
in >> n >> m;
radical = sqrt(n);
for( i = 0; i < n ; i++ ){
in >> v[i];
batog[getblock(i)] = max( batog[getblock(i)] , v[i]);
}
for( i = 0 ; i < m ; i++ ){
in >> cer >> a >> b;
a--;
if( cer == 0 )
out << maxim( a , b-1 ) << endl;
else
inlocuire( a , b );
}
return 0;
}