Cod sursa(job #2603058)

Utilizator segtreapMihnea Andreescu segtreap Data 18 aprilie 2020 14:56:14
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.19 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int OO = (int) 1e9;

struct Node {
        Node *lft;
        Node *rgh;
        int l;
        int r;
        int store;
        Node() {
                lft = rgh = 0;
                store = -OO;
                l = r = 0;
        }
};

void upd(Node *cur, int p, int x) {
        if (cur->r < p || p < cur->l) {
                return;
        }
        if (cur->l == cur->r) {
                cur->store = x;
                return;
        }
        if (!cur->lft) {
                cur->lft = new Node;
                cur->lft->l = cur->l;
                cur->lft->r = (cur->l + cur->r) / 2;
        }
        if (!cur->rgh) {
                cur->rgh = new Node;
                cur->rgh->l = (cur->l + cur->r) / 2 + 1;
                cur->rgh->r = cur->r;
        }
        upd(cur->lft, p, x);
        upd(cur->rgh, p, x);
        cur->store = max(cur->lft->store, cur->rgh->store);
}

int get(Node *cur, int l, int r) {
        if (cur->r < l || r < cur->l) {
                return -OO;
        }
        if (l <= cur->l && cur->r <= r) {
                return cur->store;
        }
        if (!cur->lft) {
                cur->lft = new Node;
                cur->lft->l = cur->l;
                cur->lft->r = (cur->l + cur->r) / 2;
        }
        if (!cur->rgh) {
                cur->rgh = new Node;
                cur->rgh->l = (cur->l + cur->r) / 2 + 1;
                cur->rgh->r = cur->r;
        }
        return max(get(cur->lft, l, r), get(cur->rgh, l, r));
}

Node *root = new Node;

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

        int n, q;
        scanf("%d %d", &n, &q);
        root->l = 1;
        root->r = n;
        for (int i = 1; i <= n; i++) {
                int x;
                scanf("%d", &x);
                upd(root, i, x);
        }
        while (q--) {
                int t, a, b;
                scanf("%d %d %d", &t, &a, &b);
                if (t == 0) {
                        printf("%d\n", get(root, a, b));
                } else {
                        upd(root, a, b);
                }
        }
}