Cod sursa(job #2738445)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 5 aprilie 2021 20:52:04
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>

using namespace std;

const int N = 1e5;
const int LOG = 17;

int v[N + 1], r[LOG][N + 1], log2[N + 1];

void precalc(int n) {
    for (int i = 2; i <= n; ++i)
        log2[i] = 1 + log2[i / 2];
}

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

    int n, q;
    in >> n >> q;
    for (int i = 1; i <= n; ++i)
        in >> v[i];
    precalc(n);
    int p2;
    for (int j = 1; j <= n; ++j)
        r[0][j] = v[j];
    for (int j = 1; j <= n; ++j)
        for (int i = 1; i <= log2[n] && (1 << i) <= j; ++i) {
            p2 = (1 << (i - 1));
            r[i][j] = min(r[i - 1][j - p2], r[i - 1][j]);
        }
    int x, y, lg;
    while (q--) {
        in >> x >> y;
        lg = log2[y - x + 1];
        p2 = (1 << lg);
        out << min(r[lg][y], r[lg][x + p2 - 1]) << '\n';
    }

    in.close();
    out.close();
    return 0;
}