Cod sursa(job #2379686)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 13 martie 2019 22:04:52
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cmath>
#include <fstream>

#define LMAX 20
#define NMAX 100010

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

int n;
int v[NMAX];

int q;
int dp[NMAX][LMAX];

inline int min(int x, int y) {
    return x < y ? x : y;
}

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

int main() {
    fin >> n >> q;
    for (int i = 1; i <= n; i++) {
        fin >> v[i];
        dp[i][0] = i;
    }

    for (int i = n; i >= 1; i--)
        for (int j = 1; i + (1 << j) - 1 <= n; j++)
            if (v[dp[i][j - 1]] < v[dp[i + (1 << (j - 1)) - 1][j - 1]])
                dp[i][j] = dp[i][j - 1];
            else
                dp[i][j] = dp[i + (1 << (j - 1)) - 1][j - 1];

    int lo, hi;
    for (int it = 0; it < q; it++) {
        fin >> lo >> hi;
        fout << rmq(lo, hi) << '\n';
    }

    fout.close();
    return 0;
}