Cod sursa(job #2665183)

Utilizator andrei.florea0405Florea Andrei-Bogdan andrei.florea0405 Data 30 octombrie 2020 11:49:30
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <bits/stdc++.h>


void buildTree(int node, int left, int right, std::vector<int>& arb_int, const std::vector<int>& input) {
    if (left == right) {
        arb_int[node] = input[left];
    } else {
        int middle = left + (right - left) / 2;
        
        buildTree(2 * node, left, middle, arb_int, input);
        buildTree(2 * node + 1, middle + 1, right, arb_int, input);
        arb_int[node] = std::min(arb_int[2 * node], arb_int[2 * node + 1]);
    }
}

void answerQuery(int node, int left, int right, std::vector<int>& arb_int, std::pair<int, int> query, int& ans) {
    if (query.first <= left && right <= query.second) {
        ans = std::min(ans, arb_int[node]);
        return;
    }

    int middle = left + (right - left) / 2;
    if (query.first <= middle)
        answerQuery(2 * node, left, middle, arb_int, query, ans);
    if (query.second > middle)
        answerQuery(2 * node + 1, middle + 1, right, arb_int, query, ans);
}

std::vector<int> rmq(const std::vector<int>& input, const std::vector< std::pair<int, int> >& queries) {
    int n = input.size();

    int height = (int)(ceil(log2(n)));  
    int tree_size = 2*(int)pow(2, height) - 1;  

    std::vector<int> output;
    std::vector<int> arb_int(tree_size, INT_MAX);

    buildTree(1, 0, n - 1, arb_int, input);

    for (auto query : queries) {
        int answer = INT_MAX;
        answerQuery(1, 0, n - 1, arb_int, query, answer);
        output.push_back(answer);
    }

    return output;
}

int main() {
    int n, m;
    std::ios::sync_with_stdio(0), std::cin.tie(0);
    std::ifstream fin("rmq.in");
    std::ofstream fout("rmq.out");

    fin >> n >> m;
    std::vector<int> a(n);

    for (int i = 0; i < n; i++) {
        fin >> a[i];
    }

    int l, r;
    std::vector< std::pair<int, int> > queries;
    for (int i = 0; i < m; i++) {
        fin >> l >> r;
        l--; r--;
        queries.push_back(std::make_pair(l, r));
    }

    std::vector<int> output;
    output = rmq(a, queries);

    for (int i = 0; i < m; i++)
        fout << output[i] << "\n";

    fin.close();
    fout.close();
    return 0;
}