Cod sursa(job #928004)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 26 martie 2013 10:25:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;

int V[4 * 100001], A[100005], x, y;

void creare_arbore (int nod, int l, int r) {
    if (l == r) {
        V[nod] = A[l];
        return;
    }
    int m = (l + r) / 2;
    creare_arbore (2 * nod, l ,m);
    creare_arbore (2 * nod + 1, m + 1, r);
    V[nod] = max (V[2 * nod], V[2 * nod + 1]);
}

void updatare_arbore (int nod, int l, int r) {
    if (l == r) {
        V[nod] = y;
        return;
    }
    int m = (l + r) / 2;
    if (x <= m)
        updatare_arbore (nod * 2, l, m);
    else
        updatare_arbore (nod * 2 + 1, m + 1, r);
    V[nod] = max (V[2 * nod], V[2 * nod + 1]);
}

int querry_arbore (int nod, int l, int r) {
    if (x <= l && r <= y)
        return V[nod];
    if (x > r || y < l)
        return -1;
    int m = (l + r) / 2;
    return max (querry_arbore (nod * 2, l, m), querry_arbore (nod * 2 + 1, m + 1, r));
}

int main () {
    freopen ("arbint.in", "r", stdin); freopen ("arbint.out", "w", stdout);
    int N, M, i, op;
    scanf ("%d%d", &N, &M);
    for (i = 1; i <= N; ++i)
        scanf ("%d", &A[i]);
    creare_arbore (1, 1, N);
    while (M--) {
        scanf ("%d%d%d", &op, &x, &y);
        if(op)
            updatare_arbore (1, 1, N);
        else
            printf ("%d\n", querry_arbore(1, 1, N));
    }
}