Cod sursa(job #752538)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 28 mai 2012 20:28:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int maxn = 100005;
int arbint[4 * maxn], v[maxn];

void build(int nod, int left, int right)
{
    int m;
    m = (left + right) / 2;
    if(left == right) {
        arbint[nod] = v[left];
        return;
    }
    build(2 * nod, left, m);
    build(2 * nod + 1, m + 1, right);
    arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}

void update(int nod, int left, int right, int x, int y)
{
    int m;
    m = (left + right) / 2;
    if(left == x && left == right) {
        //fprintf(stderr, "%d %d %d\n", left, right, arbint[nod]);
        arbint[nod] = y;
        return;
    }
    if(x <= m)
        update(2 * nod, left, m, x, y);
    else
        update(2 * nod + 1, m + 1, right, x, y);
    arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
    //fprintf(stderr, "%d %d %d\n", left, right, arbint[nod]);
}

int query(int nod, int left, int right, int x, int y)
{
    int m, rl = 0, rr = 0;
    m = (left + right) / 2;
    if(left >= x && right <= y) {
        //fprintf(stderr, "%d %d %d\n", left, right, arbint[nod]);
        return arbint[nod];
    }
    if(x <= m)
        rl = query(2 * nod, left, m, x, y);
    if(y > m)
        rr = query(2 * nod + 1, m + 1, right, x, y);
    return max(rl, rr);
}


int main()
{
    int i, n, m, tip, a, b;
    freopen ("arbint.in", "r", stdin);
    freopen ("arbint.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
    build(1, 1, n);
    for(i = 1; i <= m; ++i) {
        scanf("%d %d %d", &tip, &a, &b);
        if(tip == 0) {
            printf("%d\n", query(1, 1, n, a, b));
            //fprintf(stderr, "\n");
        }
        else
            update(1, 1, n, a, b);
    }
    return 0;
}