Cod sursa(job #2819628)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 18 decembrie 2021 18:55:51
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 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;
};
void DAU(string const& task = "") {
    if (!task.empty())
        freopen((task + ".in").c_str(), "r", stdin),
        freopen((task + ".out").c_str(), "w", stdout);
    else
        ios::sync_with_stdio(false),
        cin.tie(0),
        cout.tie(0);
}
int n, q, x, y;
vector<int> v;
int main() {
    DAU("rmq");
    cin >> n >> q;
    v.resize(n);
    for (int& x : v)
        cin >> x;
    RMQ rmq(v);
    while (q--) {
        cin >> x >> y;
        cout << rmq.Query(x, y) << '\n';
    }
    return 0;
}