Cod sursa(job #288441)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 25 martie 2009 19:52:38
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.86 kb
#include<stdio.h>
#define N 100004

int n, m, a[N][20];

void citire(), rezolva();
inline int min(int a, int b){if (a<b) return a; else return b;}

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

    citire();
    rezolva();

    return 0;
}

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

void rezolva(){
int j, q, i, x, y, l, k;

    for (j = 1, q = 2; q <= n; j++, q <<= 1 )
        for (i = 1; i <= n - q + 1; i++){
            a[i][j] = a[i][j-1];
            if (a[i][j] > a[i + (q >> 1)][j-1])
                a[i][j] = a[i + (q >> 1)][j-1];
        }

    for (; m; m--){
        scanf("%d %d", &x, &y);
        for (k = y - x + 1, l = 0, q = 2; q <= k; l++, q <<= 1);

        printf("%d\n", min(a[x][l] , a[y - (q >> 1) + 1][l]) );
    }
}