Cod sursa(job #886485)

Utilizator toranagahVlad Badelita toranagah Data 22 februarie 2013 21:34:33
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <algorithm>
#include <fstream>
using namespace std;

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

const int MAX_N = 100100;
const int MAX_LOG = 18;

int N, M;
int rm[MAX_N][MAX_LOG];
int log2[MAX_LOG];
int v[MAX_N];

void compute_rm();
int rmq(int lo, int hi);

int main() {
    fin >> N >> M;
    for (int i = 1; i <= N; ++i) {
        fin >> v[i];
    }
    compute_rm();
    for (int i = 1; i <= M; ++i) {
        int a, b;
        fin >> a >> b;
        fout << rmq(a, b) << '\n';
    }
    return 0;
}

void compute_rm() {
    for (int i = 1; i <= N; ++i) {
        rm[i][0] = v[i];
    }
    for (int j = 1; (1 << j) <= N; ++j) {
        for (int i = 1; i + (1 << j) - 1 <= N; ++i) {
            rm[i][j] = min(rm[i][j - 1], rm[i + (1 << (j - 1))][j - 1]);
        }
    }
    log2[1] = 0;
    for (int i = 2; i < MAX_LOG; ++i) {
        log2[i] = log2[i / 2] + 1;
    }
}

inline int rmq(int lo, int hi) {
    int k = log2[hi - lo + 1];
    return min(rm[lo][k], rm[hi - (1 << k) + 1][k]);
}