Cod sursa(job #925169)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 24 martie 2013 13:38:51
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>
using namespace std;

#define Nmax 100005

int n, m, pos, val, maxx, a, b;
int tree[Nmax];

inline int max(int a, int b){
    if(a > b) return a;
    return b;
}

void update(int node, int left, int right){
    if(left == right){
        tree[node] = val;
        return;
    }

    int m = (left+right)/2;
    if(pos <= m) update(2*node, left, m);
    else update(2*node+1, m+1, right);

    tree[node] = max(tree[2*node], tree[2*node+1]);
}

void read(){
    scanf("%i %i", &n, &m);
    for(int i = 1; i <= n; ++i){
        scanf("%i", &val);
        pos = i;
        update(1,1,n);
    }
}

void query(int node, int left, int right){
    if( a <= left && right <= b)
        maxx = max(maxx, tree[node]);
    else{
        int m = (left+right)/2;
        if(a <= m) query(2*node, left, m);
        if(m < b) query(2*node+1, m+1, right);
    }
}

void solve(){
    int op;
    for(int i = 1; i <= m; ++i){
        scanf("%i", &op);
        if(op == 1){
            scanf("%i %i", &pos, &val);
            update(1,1,n);
        }
        else{
            scanf("%i %i", &a, &b);
            maxx = -1;
            query(1,1,n);
            printf("%i\n", maxx);
        }
    }
}

int main(){
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    read();
    solve();
    fclose(stdin);
    fclose(stdout);

    return 0;
}