Cod sursa(job #1488767)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 19 septembrie 2015 19:04:40
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>

#define NMAX 100010
#define ELEMMAX 100010
#define MMAX 1000010
#define LOGMAX 17
#define min(x,y) ((x) < (y) ? (x) : (y))

int v[NMAX], rmq[NMAX][LOGMAX]; //minimul pentru secventa de lungime 2 ^ j care incepe de pe pozitia i
int N, M;
int log[ELEMMAX];

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

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

    scanf ("%d%d", &N, &M);
    for (int i = 1; i <= N; i++) {
        scanf ("%d", &v[i]);
        rmq[i][0] = v[i];
    }

    for (int j = 1; j <= log[N]; j++) {
        for (int i = 1; i + (1 << j) <= N + 1; i++) {
            rmq[i][j] = min (rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
        }
    }

    int x, y;
    for (int i = 1; i <= M; i++) {
        scanf ("%d%d", &x, &y);

        int k = log[y - x + 1];

        int ans = min (rmq[x][k], rmq[y - (1 << k) + 1][k]);

        printf ("%d\n", ans);
    }

    return 0;
}