Cod sursa(job #1978308)

Utilizator LittleWhoFeraru Mihail LittleWho Data 7 mai 2017 13:57:42
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

#define UPDATE 1
#define QUERY 0

vector<int> input_v;
vector<int> range_tree;

int build_tree(int node, int l, int r)
{
    if (l == r) {
        range_tree[node] = input_v[l];
    } else {
        int m = (l + r) / 2;
        range_tree[node] = max(build_tree(2 * node + 1, l, m),
                                build_tree(2 * node + 2, m + 1, r));
    }
    return range_tree[node];
}

void update(int node, int pos, int val, int l, int r)
{
    if (l == r) {
        if (l == pos) {
            range_tree[node] = val;
        }
        return ;
    }

    int m = (l + r) / 2;
    if (pos <= m) {
        update(2 * node + 1, pos, val, l, m);
    } else if (pos > m) {
        update(2 * node + 2, pos, val, m + 1, r);
    }
    range_tree[node] = max(range_tree[2 * node + 1], range_tree[2 * node + 2]);
}

int query(int node, int target_l, int target_r, int l, int r)
{
    if (target_l == l && target_r == r) return range_tree[node];
    if (l == r) return range_tree[node];

    int m = (l + r) / 2;
    if (target_r <= m) {
        return query(2 * node + 1, target_l, target_r, l, m);
    } else if (target_l >= m) {
        return query(2 * node + 2, target_l, target_r, m + 1, r);
    }
    return max(query(2 * node + 1, target_l, target_r, l, m),
               query(2 * node + 2, target_l, target_r, m + 1, r));
}

int main() {
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    int n, m;
    cin >> n >> m;

    range_tree.reserve(4 * n + 666);
    input_v.reserve(n);
    for (int i = 0; i < n; i++) cin >> input_v[i];
    build_tree(0, 0, n - 1);

    for (int i = 0; i < m; i++) {
        int op, a, b;
        cin >> op >> a >> b;
        if (op == QUERY) {
            cout << query(0, a - 1, b - 1, 0, n - 1) << "\n";
        } else {
             update(0, a - 1, b, 0, n - 1);
        }
    }

    return 0;
}