Pagini recente » Cod sursa (job #990504) | Cod sursa (job #831783) | Cod sursa (job #337923) | Cod sursa (job #322705) | Cod sursa (job #466833)
Cod sursa(job #466833)
#include <stdlib.h>
#include <cstdio>
#include <algorithm>
using namespace std;
int aib[100001];
int vec[100001];
int n,m,nr,o,a,b;
#define ZERO(x) ( (x ^ (x - 1)) & x )
#define INF (0x3f3f3f)
void clamp(int& nr) {
if( nr == 0 )
nr = 1;
}
int query(int a,int b) {
clamp(a);
if(a>=b)
return -INF;
int rez = vec[b];
for(int i = b ; i >= a ; )
if(i - ZERO(i) >= a )
rez = max( rez , aib[i]) , i -= ZERO(i);
else
rez = max( rez , vec[i]) , i--;
return rez;
}
void update(int p,int nr) {
vec[p] = nr;
aib[p] = max( query(p - ZERO(p) , p - 1 ) , vec[p] );
for(int i = p + ZERO(p) ; i <= n ; i += ZERO(i) )
// aib[i] = max (aib[i-ZERO(i)] , query(i-ZERO(i) , i) );
aib[i] = max (vec[p] , max(query(p + 1 , i ) , query(i - ZERO(i) , p - 1) ) );
}
int main(int argc, char** argv) {
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1 ; i <= n ; i++) {
scanf("%d",&nr);
update(i,nr);
//printf("ini\n");
}
//printf("initializat!\n");
for(int i = 1 ; i <= m ; i++) {
scanf("%d %d %d",&o,&a,&b);
if(o == 0)
printf("%d\n",query(a,b));
else
update(a,b);
//printf("pasul %d \n",i);
}
return 0;
}