Cod sursa(job #2170542)

Utilizator LittleWhoFeraru Mihail LittleWho Data 15 martie 2018 07:50:47
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = static_cast<int> (1e5+1);
const int lgnmax = 18;

int n, m;
int dp[lgnmax][nmax];

inline int pow2(int x) {
    return (1 << x);
}

int lg2[nmax];
void precalc_lg2() {
    lg2[0] = 1;
    for (int i = 2; i <= n; i++) {
        lg2[i] = lg2[i / 2] + 1;
    }
}

void build_rmq() {
    precalc_lg2();

    for (int i = 1; i <= lg2[n]; i++) {
        for (int j = 1; j <= n - pow2(i) + 1; j++) {
            dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + pow2(i - 1)]);
        }
    }
}

int query(int x, int y) {
    if (x > y) swap(x, y);
    int k = lg2[y - x + 1];
    return min(dp[k][x], dp[k][y - pow2(k) + 1]);
}

int main() {
    freopen("carici.in", "r", stdin);

    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &dp[0][i]);
    }

    build_rmq();

    for (int i = 1, x, y; i <= m; i++) {
        scanf("%d%d", &x, &y);
        cout << query(x, y) << "\n";
    }

    return 0;
}