Cod sursa(job #1740508)

Utilizator AplayLazar Laurentiu Aplay Data 11 august 2016 17:48:46
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

#define NMAX 100001
#define MAXLOG 17

#define minn(a, b) a < b ? a : b

using namespace std;

int N, M, x, y, range[NMAX][MAXLOG], values[NMAX];

void preprocess() {
    for (int it = 0; it < N; ++it) {
        range[it][0] = it;
    }

    for (int j = 1; 1 << j <= N; ++j) {
        for (int i = 0; i + (1 << j) - 1 < N; ++i) {
            if (values[range[i][j - 1]] < values[range[i + (1 << (j - 1))][j - 1]]) {
                range[i][j] = range[i][j - 1];
            } else {
                range[i][j] = range[i + (1 << (j - 1))][j - 1];
            }
        }
    }
}

int findMin(int a, int b) {
    int k = (int) log2(b - a + 1);
    return minn(values[range[a][k]], values[range[b - (1 << k) + 1][k]]);
}

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

    scanf("%d%d", &N, &M);
    for (int it = 0; it < N; ++it) {
        scanf("%d", &values[it]);
    }

    preprocess();

    for (int it = 0; it < M; ++it) {
        scanf("%d%d", &x, &y);
        printf("%d\n", findMin(x - 1, y - 1));
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}