Cod sursa(job #1220637)

Utilizator g3ppyStoian Vlad g3ppy Data 17 august 2014 22:54:43
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <stdio.h>

int rmq[100001][17];
int N, M;

int log2(int bits) {
    return (bits & 0x80000000) ? 31 : log2((bits << 1) | 1) - 1;
}

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

int main() {

    freopen("rmq.in", "rt", stdin);
    freopen("rmq.out", "wt", stdout);

    scanf("%d %d", &N, &M);

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

    int log2n = log2(N) + 1;

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

    for (int i = 0; i < M; ++i) {
        int x, y;

        scanf("%d %d", &x, &y);

        int difflog = log2(y - x + 1);

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

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

    return 0;
}