Cod sursa(job #2592929)

Utilizator copanelTudor Roman copanel Data 2 aprilie 2020 16:48:16
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>
#include <algorithm>
#include <iostream>

int rmq[17][100001];
int log2[100001];

int main() {
    std::ifstream fin("rmq.in");
    std::ofstream fout("rmq.out");
    int n, m;

    fin >> n >> m;
    log2[1] = 0;
    for (int i = 2; i <= n; i++) {
        log2[i] = 1 + log2[i / 2];
    }
    for (int i = 1; i <= n; i++) {
        fin >> rmq[0][i];
    }
    int log = log2[n];
    for (int i = 1; i <= log; i++) {
        int p = (1 << i);
        for (int j = p; j <= n; j++) {
            rmq[i][j] = std::min(rmq[i - 1][j], rmq[i - 1][j - p / 2]);
        }
    }

    for (; m > 0; m--) {
        int a, b;
        fin >> a >> b;
        if (a == b) {
            fout << rmq[0][a] << '\n';
            continue;
        }

        int l = log2[b - a + 1];
        fout << std::min(rmq[l][b], rmq[l][a + (1 << l) - 1]) << '\n';
    }
    return 0;
}