Cod sursa(job #2462562)

Utilizator preda.andreiPreda Andrei preda.andrei Data 27 septembrie 2019 16:37:23
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>

using namespace std;

class Rmq
{
public:
    Rmq(const vector<int> &vec);

    int Min(int left, int right) const;

private:
    vector<vector<int>> mins_;
};

Rmq::Rmq(const vector<int> &vec)
{
    mins_.resize(vec.size());

    for (int i = 0; i < (int)vec.size(); i += 1) {
        mins_[i].push_back(vec[i]);

        int index = 0;
        int prev = i - (1 << index);

        while (index < (int)mins_[prev].size()) {
            mins_[i].push_back(min(mins_[i].back(), mins_[prev][index]));
            index += 1;
            prev = i - (1 << index);
        }
    }
}

int Rmq::Min(int left, int right) const
{
    int index = 0;
    while ((1 << (index + 1)) <= right - left + 1) {
        index += 1;
    }

    int res = min(mins_[right][index], mins_[left + (1 << index) - 1][index]);
    return res;
}

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

    int n, tests;
    fin >> n >> tests;

    vector<int> vec(n);
    for (auto &num : vec) {
        fin >> num;
    }

    Rmq rmq(vec);
    for (int i = 0; i < tests; i += 1) {
        int left, right;
        fin >> left >> right;
        fout << rmq.Min(left - 1, right - 1) << "\n";
    }
    return 0;
}