Cod sursa(job #1495254)

Utilizator diana97Diana Ghinea diana97 Data 2 octombrie 2015 20:18:07
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f ("rmq.in");
ofstream g ("rmq.out");

const int NMAX = 100000 + 1;
const int LOGMAX = 17;


int n, q;

int log2[NMAX];
int pow2[LOGMAX];
int rmq[LOGMAX][NMAX];

void read() {
    f >> n >> q;
    for (int i = 1; i <= n; i++) f >> rmq[0][i];
}

void init() {
    for (int i = 2; i <= n; i++) log2[i] = log2[i / 2] + 1;

    pow2[0] = 1;
    for (int i = 1; i < LOGMAX; i++) pow2[i] = pow2[i - 1] * 2;

    for (int p = 1; pow2[p] <= n; p++) {
        int lg = pow2[p - 1];
        for (int i = 1; i <= n - lg + 1; i++)
            rmq[p][i] = min(rmq[p - 1][i], rmq[p - 1][i + lg]);
    }
}

void solve() {
    int a, b;

    for (int i = 1; i <= q; i++) {
        f >> a >> b;
        int lg = log2[b - a + 1];
        b = b + 1 - pow2[lg];
        g << min(rmq[lg][a], rmq[lg][b]) << '\n';
    }
}

int main() {
    read();
    init();
    solve();
    return 0;
}