Cod sursa(job #1556776)

Utilizator Ionut.popescuLiviu Rebreanu Ionut.popescu Data 25 decembrie 2015 22:10:34
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>

using namespace std;

struct segTree {
    int key;
    segTree *left, *right;
    segTree() {
        left = NULL;
        right = NULL;
        key = 0;
    }
};

segTree *Root;
int s;

void updateKey(segTree* &node, int left, int right, int indx, int key) {
    if (node == NULL) {
        node = new segTree;
    }
    if (left != right) {
        int mid = (left + right) / 2;
        if (indx <= mid) {
            updateKey(node->left, left, mid, indx, key);
        } else {
            updateKey(node->right, mid + 1, right, indx, key);
        }
        node->key = 0;
        if (node->left != NULL) {
            node->key = node->left->key;
        }
        if (node->right != NULL) {
            node->key = max(node->key, node->right->key);
        }
    } else {
        node->key = key;
    }
}

void query(segTree* node, int left, int right, int st, int fn) {
    if (left > fn || right < st || node == NULL) {
        return;
    }
    if (st <= left && right <= fn) {
        s = max(s, node->key);
    }
    int mid = (left + right) / 2;

    if (st <= mid) {
        query(node->left, left, mid, st, fn);
    }
    if (fn > mid) {
        query(node->right, mid + 1, right, st, fn);
    }
}

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

    scanf("%d%d", &N, &M);
    for (int i = 0; i < N; i++) {
        int x;
        scanf("%d", &x);
        updateKey(Root, 0, N - 1, i, x);
    }

    while (M--) {
        int opType;
        scanf("%d", &opType);
        if (!opType) {
            int st, fn;
            scanf("%d%d", &st, &fn);
            s = 0;
            query(Root, 0, N - 1, st - 1, fn - 1);
            printf("%d\n", s);
        } else {
            int poz, key;
            scanf("%d%d", &poz, &key);
            updateKey(Root, 0, N - 1, poz - 1, key);
        }
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}