Cod sursa(job #1656422)

Utilizator wilversingsMarius Aiordachioaei wilversings Data 19 martie 2016 12:23:13
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMAX = 100002;

int rangeTree[2 * NMAX];

int V[NMAX];
void rangeTreeBuild (const int left, const int right, const int node) {

    if (left == right) {
        rangeTree[node] = V[left];
        return;
    }

    int middle = left + right >> 1;
    rangeTreeBuild (left, middle, node * 2);
    rangeTreeBuild (middle + 1, right, node * 2 + 1);

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

}

int updateValue, updateIndex;
void rangeTreeUpdate (const int left, const int right, const int node) {

    if (left == right) {
        rangeTree[node] = updateValue;
        return;
    }
    int middle = left + right >> 1;
    if (updateIndex <= middle)
        rangeTreeUpdate (left, middle, node * 2);
    else
        rangeTreeUpdate (middle + 1, right, node * 2 + 1);

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

}

int queriedLeft, queriedRight;
int rangeTreeQuery (const int left, const int right, const int node) {

    if (left > queriedRight || right < queriedLeft)
        return 0;
    if (left >= queriedLeft && right <= queriedRight)
        return rangeTree[node];

    int middle = left + right >> 1;

    return max (
        rangeTreeQuery (left, middle, node * 2),
        rangeTreeQuery (middle + 1, right, node * 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);
    }
    rangeTreeBuild (1, N, 1);

    while (M--) {
        int operation, a, b;
        scanf ("%d%d%d", &operation, &a, &b);
        switch (operation) {

        case 0:
            queriedLeft = a;
            queriedRight = b;
            printf ("%d\n", rangeTreeQuery(1, N, 1));
            break;
        case 1:
            updateIndex = a;
            updateValue = b;
            rangeTreeUpdate (1, N, 1);
            break;

        }
    }

}