Cod sursa(job #1976958)

Utilizator blatulInstitutul de Arta Gastronomica blatul Data 4 mai 2017 17:28:42
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 100002
#define LGMAX 19

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

int RMQ[LGMAX][NMAX], lg[NMAX];

void prepareRMQ(const int N) {

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

    for (int i = 2; i <= N; ++i)
        lg[i] = lg[i >> 1] + 1;

    for (int k = 1; (1 << k) <= N; ++k) {

        int t = (1 << (k - 1));
        for (int i = 1; i + t - 1 <= N; ++i) {
            RMQ[k][i] = min(RMQ[k - 1][i], RMQ[k - 1][i + t]);
        }
    }
}

int query(int st, int dr) {

    int dist = dr - st + 1;

    int t = lg[dist];

    return min(RMQ[t][st], RMQ[t][dr - (1 << t) + 1]);
}

int main() {

    int N, M;

    fin >> N >> M;

    prepareRMQ(N);

    int x, y;
    while (M--) {

        fin >> x >> y;

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

    return 0;
}