Cod sursa(job #3160626)

Utilizator juincPopescu Marian juinc Data 24 octombrie 2023 18:42:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
#include <cmath>

#define N_MAX 100005
#define EXP_MAX 17

int vec[N_MAX];
int vals[N_MAX][EXP_MAX];

int RMQ(std::pair<int, int> range) {
    int length = range.second - range.first + 1;
    int power = std::log2(length);

    return std::min(vals[range.first][power], vals[range.second - (1 << power) + 1][power]);
}

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

    int n, q, i;
    fin >> n >> q;

    for (i = 0; i < n; i++) {
        fin >> vec[i];
        vals[i][0] = vec[i];
    }

    for (int exp = 1; exp < EXP_MAX; exp++)
        for (int i = 0; i + (1 << exp) <= n; i++)
            vals[i][exp] = std::min(vals[i][exp - 1], vals[i + (1 << (exp - 1))][exp - 1]);

    for (int i = 0; i < q; i++) {
        int a, b;
        fin >> a >> b;
        fout << RMQ({ a-1,b-1 }) << '\n';
    }

    return 0;
}