Cod sursa(job #2152765)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 5 martie 2018 19:40:04
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

#define MAXN 100005

using namespace std;

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

int N, M, log[MAXN];
int rmq[21][MAXN];

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

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

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

inline void RMQ() {
    int m = log[N];

    for (int i = 1; i <= m; i++) {
        for (int j = 1; j + (1 << (i - 1)) <= N; j++) {
            if (rmq[i - 1][j] < rmq[i - 1][j + (1 << (i - 1))]) {
                rmq[i][j] = rmq[i - 1][j];
            }
            else
                rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
        }
    }
}

inline int Query(int a, int b) {
    int mm = log[b - a + 1];

    return min(rmq[mm][a], rmq[mm][b - (1 << mm) + 1]);
}

inline void Solve() {
    int x, y;

    while (M--) {
        fin >> x >> y;

        fout << Query(x, y) << "\n";
    }
}

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

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