Cod sursa(job #1992606)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 20 iunie 2017 22:10:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>

void update(int node, int left, int right, int ind, int val, std::vector<int> &arr) {
    if (left == right) {
        arr[node] = val;
        return;
    }
    int m = left + (right - left) / 2;
    int l = node * 2;
    int r = l + 1;
    if (ind <= m) {
        update(l, left, m, ind, val, arr);
    } else {
        update(r, m + 1, right, ind, val, arr);
    }
    arr[node] = std::max(arr[l], arr[r]);
}

int query(int node, int left, int right, int a, int b, std::vector<int> &arr) {
    if (a <= left && right <= b) {
        return arr[node];
    }
    int m = left + (right - left) / 2, res1 = -1, res2 = -1;
    int l = node * 2;
    int r = l + 1;
    if (a <= m) {
        res1 = query(l, left, m, a, b, arr);
    }
    if (m < b) {
        res2 = query(r, m + 1, right, a, b, arr);
    }
    return std::max(res1, res2);
}

int main() {
    std::ifstream in("arbint.in");
    std::ofstream out("arbint.out");

    int nV, oP, o, b, d;

    in >> nV >> oP;

    std::vector<int> arr((nV + 1) * 4, -1);

    for (int i(1); i <= nV; i++) {
        in >> b;
        update(1, 1, nV, i, b, arr);
    }

    for(int i = 0; i < oP; i++) {
        in >> o >> b >> d;
        if(o == 0) {
            out << query(1, 1, nV, b, d, arr) << '\n';
        } else {
            update(1, 1, nV, b, d, arr);
        }
    }

    in.close();
    out.close();
    return 0;
}