Cod sursa(job #3235443)

Utilizator madalinioanaMadalin Ioana madalinioana Data 17 iunie 2024 21:58:38
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>

const int MAX_N = 100'005;
const int LOG = 17;
int a[MAX_N];
int m[MAX_N][LOG]; // m[i][j] is minimum among a[i..i+2^j-1]
int bin_log[MAX_N];

int query(int L, int R) { // O(1)
    int length = R - L + 1;
    int k = bin_log[length];
    return std::min(m[L][k], m[R-(1<<k)+1][k]);
}

int main() {

    std::ifstream fin("rmq.in");
    std::ofstream fout("rmq.out");

    // 1) read input
    int M, N;
    fin >> M >> N;

    bin_log[1] = 0;
    for(int i = 2; i <= M; i++) {
        bin_log[i] = bin_log[i/2]+1;
    }

    for(int i = 0; i < M; i++) {
        fin >> a[i];
        m[i][0] = a[i];
    }

    // 2) preprocessing, O(N*log(N))
    for(int k = 1; k < LOG; k++) {
        for(int i = 0; i + (1 << k) - 1 < M; i++) {
            m[i][k] = std::min(m[i][k-1], m[i+(1<<(k-1))][k-1]);
        }
    }
    // 3) answer queries
    for(int i = 0; i < N; i++) {
        int l, r;
        fin >> l >> r;
        l -= 1;
        r -= 1;
        fout << query(l, r) << "\n";
    }

    fin.close();
    fout.close();

    return 0;
}