Cod sursa(job #2902489)

Utilizator AndreiAncutaAndrei Ancuta AndreiAncuta Data 16 mai 2022 15:28:30
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <vector>

int main() {
    std::ifstream ifs("rmq.in");

    int n, m;
    ifs >> n >> m;

    std::vector<int> log2_table(n + 1);
    log2_table[1] = 0;
    for (int i = 2; i <= n; ++i) {
        log2_table[i] = log2_table[i / 2] + 1;
    }

    std::vector<std::vector<int>> sparse_table(n + 1);

    for (int i = 0; i < n; ++i) {
        int x;
        ifs >> x;

        sparse_table[i].resize(log2_table[n] + 1);
        sparse_table[i][0] = x;
    }

    for (int j = 1; (1 << j) <= n; ++j) {
        for (int i = 0; i + (1 << j) - 1 < n; ++i) {
            sparse_table[i][j] =
                std::min(sparse_table[i][j - 1],
                         sparse_table[i + (1 << (j - 1))][j - 1]);
        }
    }

    std::ofstream ofs("rmq.out");

    // Read queries
    for (int q = 0; q < m; ++q) {
        int l, r;
        ifs >> l >> r;
        // Input is 1-indexed
        l--; r--;

        int j = log2_table[r - l + 1];
        ofs << std::min(sparse_table[l][j], sparse_table[r - (1 << j) + 1][j]) << '\n';
    }

    ifs.close();
    ofs.close();

    return 0;
}