Cod sursa(job #467675)

Utilizator nashnash mit nash Data 29 iunie 2010 21:40:11
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#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) )
#define INF (0x3f3f3f)


inline int query(int a,int b) {
    int vmax = -INF;
    if(a>b) return -INF;
    
    for(int i = b ; i >= a ; )
        if(i - ZERO(i) >= a )
            vmax = max( vmax , aib[i]) , i -= ZERO(i);
        else
            vmax = max( vmax , vec[i]) , i--;
    
    return vmax;
}

inline void update(int p,int nr) {
    
    vec[p] = nr;
    
    //aib[p] = max( query(p - ZERO(p) + 1 , p - 1 ) , vec[p] );
    
    for(int i = p + ZERO(p) ; i <= n ; i += ZERO(i) )
        aib[i] = max (vec[p] , max( query(p + 1 , i ) , query(i - ZERO(i) + 1  , 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);
    }

    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);
    }

    return 0;
}