Cod sursa(job #2819629)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 18 decembrie 2021 18:59:13
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
using namespace std;
class RMQ {
public:
    RMQ() {}
    RMQ(vector<int> const& v) : n(static_cast<int>(v.size()) + 1) {
        log2n = static_cast<int>(log2(n));
        rmq = vector<vector<int>>(log2n + 1, vector<int>(n + 1));
        for (int i = 1; i <= n; ++i)
            rmq[0][i] = v[i - 1];
        p2 = vector<int>(log2n + 1);
        p2[0] = 1;
        for (int i = 1; i <= log2n; ++i)
            p2[i] = p2[i - 1] << 1;
        for (int i = 1; i <= log2n; ++i)
            for (int j = 1; j + p2[i] - 1 <= n; ++j)
                rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + p2[i - 1]]);
    }
    inline int Query(int const& x, int const& y) const {
        int dif = y - x + 1, k = static_cast<int>(log2(dif));
        return min(rmq[k][x], rmq[k][x + dif - p2[k]]);
    }
private:
    int n, log2n;
    vector<int> p2;
    vector<vector<int>> rmq;
};

const string task("rmq");
ifstream fin(task + ".in");
ofstream fout(task + ".out");
int n, q, x, y;
vector<int> v;
int main() {
    fin >> n >> q;
    v.resize(n);
    for (int& x : v)
        fin >> x;
    RMQ rmq(v);
    while (q--) {
        fin >> x >> y;
        fout << rmq.Query(x, y) << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}