Cod sursa(job #2266890)

Utilizator mrhammerCiocan Cosmin mrhammer Data 22 octombrie 2018 22:19:15
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb

#include <fstream>
#include <vector>

using namespace std;

int FindMin(const vector<vector<int>> &mins, int left, int right)
{
    auto exp = 0;
    while (left + (1 << exp) <= right) {
        exp += 1;
    }
    exp -= 1;
    exp = max(exp, 0);

    auto res = mins[left][exp];
    res = min(res, mins[right - (1 << exp) + 1][exp]);
    return res;
}

int main()
{
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");

    int n, queries;
    fin >> n >> queries;

    vector<vector<int>> mins(n);
    for (int i = 0; i < n; i += 1) {
        int num;
        fin >> num;
        mins[i].push_back(num);
    }

    auto exp = 0;
    while ((1 << (exp + 1)) <= n) {
        for (auto i = 0; i + (1 << (exp + 1)) <= n; i += 1) {
            auto min_num = min(mins[i][exp], mins[i + (1 << exp)][exp]);
            mins[i].push_back(min_num);
        }
        exp += 1;
    }

    for (auto i = 0; i < queries; i += 1) {
        int left, right;
        fin >> left >> right;

        auto res = FindMin(mins, left - 1, right - 1);
        fout << res << "\n";
    }

    return 0;
}