Cod sursa(job #1106694)

Utilizator lorundlorund lorund Data 13 februarie 2014 01:39:15
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>

int N, M, a, b;
int v[200005];

int max(int a, int b);
void update(int val, int li, int ls);
int query(int pos, int li, int ls);

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

    scanf("%d %d", &N, &M);
    for (a=1; a<=N; ++a){
        scanf("%d", &b);
        update(1, 1, N);
    }
    for (int i=1; i<=M; ++i){
        int op;

        scanf("%d %d %d", &op, &a, &b);
        if (!op){
            printf("%d\n", query(1, 1, N));
        }
        else{
            update(1, 1, N);
        }
    }

    return 0;
}

int max(int a, int b){
    return a>b ? a : b;
}

void update(int pos, int li, int ls){
    if (li<ls){
        int m=(li+ls)/2;

        if (a<=m){
            update(2*pos, li, m);
        }
        else{
            update(2*pos+1, m+1, ls);
        }
        v[pos] = max(v[2*pos], v[2*pos+1]);
    }
    else{
        v[pos] = b;
    }
}

int query(int pos, int li, int ls){
    if (a<=li && b>=ls){
        return v[pos];
    }

    int m=(li+ls)/2;
    if (a>m){
        return query(2*pos+1, m+1, ls);
    }
    else if (b<=m){
        return query(2*pos, li, m);
    }
    else{
        return max(query(2*pos, li, m), query(2*pos+1, m+1, ls));
    }
}