Cod sursa(job #2212280)

Utilizator CiobaCatalinCioba Catalin CiobaCatalin Data 13 iunie 2018 18:39:05
Problema Arbori de intervale Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

vector<int> arr;
vector<int> tree;

void build(int node, int start, int end) {
    if (start == end) {
        tree[node] = arr[start];
    }
    else {
        int mid = (start + end) / 2;
        int left = 2 * node;
        int right = 2 * node + 1;

        build(left, start, mid);
        build(right, mid + 1, end);

        if (tree[left] >= tree[right])
            tree[node] = tree[left];
        else 
            tree[node] = tree[right];
    }
}

int query(int node, int start, int end, int left, int right) {
    if (right < start || left > end)
        return -1;

    if (left <= start && end <= right)
        return tree[node];

    int mid = (start + end) / 2;

    int p1 = query(2 * node, start, mid, left, right);
    int p2 = query(2 * node + 1, mid + 1, end, left, right);

    if (p1 == -1)
        return p2;
    if (p2 == -1)
        return p1;
    if (p1 <= p2)
        return p2;
    return p1;
}

void update(int node, int start, int end, int idx, int val) {
    if (start == end) {
        arr[idx] = val;
        tree[node] = val;
    }
    else {
        int left = 2 * node;
        int right = 2 * node + 1;
        int mid = (start + end) / 2;

        if (start <= idx && idx <= mid) {
            update(left, start, mid, idx, val);
        }
        else {
            update(right, mid + 1, end, idx, val);
        }

        if (tree[left] < tree[right]) {
            tree[node] = tree[right];
        }
        else {
            tree[node] = tree[left];
        }
    }
}

void print_tree(ofstream& out) {
    for (auto el : tree)
        out << el << " ";
    out << endl;
}

int main() {
    ifstream in;
    ofstream out;

    in.open("arbint.in");
    out.open("arbint.out");

    int n, m;
    in >> n >> m;

    int x; 
    for (int i = 0; i < n; ++i) {
        in >> x;
        arr.push_back(x);
    }

    tree.resize(2 * n);
    tree[0] = 99999;

    build(1, 0, arr.size() - 1);

    int type, left, right;
    for (int i = 0; i < m; ++i) {
        in >> type >> left >> right;

        if (type == 0) {
            out << query(1, 0, arr.size() - 1, left - 1, right - 1) << '\n';
        }
        else {
            update(1, 0, arr.size() - 1, left - 1, right);
            // print_tree(out);
        }
    }

    in.close();
    out.close();

    return 0;
}