Cod sursa(job #2870890)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 12 martie 2022 17:23:38
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int N(1e5 + 5), LN(17);
int rmq[LN][N], p2[LN], l2[N];
void Init() {
    for (int i = 2; i < N; ++i)
        l2[i] = l2[i / 2] + 1;
    p2[0] = 1;
    for (int i = 1; i < LN; ++i)
        p2[i] = p2[i - 1] * 2;
}
void Compute(int const& n) {
    for (int l = 1; l <= l2[n]; ++l)
        for (int i = 1; i + p2[l] - 1 <= n; ++i)
            rmq[l][i] = min(rmq[l - 1][i], rmq[l - 1][i + p2[l - 1]]);
}
inline int Query(int const& x, int const& y) {
    int dif = (y - x + 1), l = l2[dif];
    return min(rmq[l][x], rmq[l][y - p2[l] + 1]);
}
int main() {
    Init();
    int n, q;
    fin >> n >> q;
    for (int i = 1; i <= n; ++i)
        fin >> rmq[0][i];
    Compute(n);
    while (q--) {
        int x, y;
        fin >> x >> y;
        fout << Query(x, y) << '\n';
    }
    return 0;
}