Cod sursa(job #648278)

Utilizator marius135Dumitran Adrian Marius marius135 Data 13 decembrie 2011 11:17:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<stdio.h>

#define maxn 1<<18
#define INF 1<<30

int arb[maxn], v[maxn>>1];

int minim( const int &a, const int &b){
    if( a > b ) return a;
    return b;
}

void creaza(int poz, int left, int right){ 
    if( left == right) {
        arb[poz] = v[left];
        return;
    }
    creaza(poz * 2, left, (left+right)>>1);
    creaza(poz * 2+1, ((left+right)>>1) +1, right);
    arb[poz] = minim( arb[poz*2], arb[poz*2+1]);
}
int get_min( int poz, int left, int right,const int &L,const int &R) { 
    if( left > R) return 0;
    if( right < L) return 0;
    if( L <= left && R >= right) 
        return arb[poz];
    return minim( get_min( poz*2, left, (left+right)/2, L, R), 
                  get_min( poz*2+1, (left+right)/2 + 1,right,L,R));
}

void update( int poz, int left, int right,const int &unde, const int &value) {
    if( unde < left) return;
    if( unde > right) return;
    
    if( left == right) {
        arb[poz ] = value; return;
    }
    update( poz * 2, left, (left+right)/2, unde, value);
    update( poz * 2+1, (left+right)/2+1, right, unde, value);
    arb[poz] = minim( arb[poz*2], arb[poz*2+1]);

}
int main() {

    
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int N, M;
    scanf("%d %d", &N, &M);
    for( int i = 1; i <= N; ++i) 
        scanf("%d", &v[i]);
    
    creaza(1,1,N);
    
    for( int i = 1; i <= M; ++i) {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        if( a == 0)
            printf("%d\n", get_min( 1, 1, N, b, c));
        else update( 1, 1, N, b, c);
    }



    return 0;
}