Cod sursa(job #2118614)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 30 ianuarie 2018 19:56:43
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>

#define MAXN 100005
#define MAXM 18

using namespace std;

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

int N, Q, rmq[MAXM][MAXN];
int log[MAXN], lg, M;

inline void Read() {
    fin >> N >> Q;

    for (int i = 1; i <= N; i++) {
        fin >> rmq[0][i];
    }

    log[1] = log[0] = 0;

    for (int i = 2; i <= N; i++)
        log[i] = log[i / 2] + 1;
}

inline void ConstructRMQ() {
    M = log[N];

    for (int i = 1; i <= M; i++) {
        for (int j = 1; j + (1 << i) - 1 <= N; j++) { ///daca de pe poz j incepand mai am cel putin 2 la i elemente
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
        }
    }
}

inline void Solve() {
    int a, b;

    while (Q--) {
        fin >> a >> b;

        lg = log[b - a + 1];
        fout << min(rmq[lg][a], rmq[lg][b - (1 << lg) + 1]) << "\n";
    }
}

int main () {
    Read();
    ConstructRMQ();
    Solve();

    fin.close(); fout.close(); return 0;
}