Cod sursa(job #1197712)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 13 iunie 2014 14:56:56
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.96 kb
//rmq[i][j]=min([j-(1<<i)+1, j])
#include <stdio.h>
#define MAXN 100000
#define LOGN 16
int rmq[LOGN+1][MAXN+1];
int lg[MAXN+1];
inline int min(int a, int b){
    if(a<=b){
        return a;
    }
    return b;
}
int main(){
    int n, q, i, k, a, b, L, j;
    FILE *fin, *fout;
    fin=fopen("rmq.in", "r");
    fout=fopen("rmq.out", "w");
    fscanf(fin, "%d%d", &n, &q);
    for(i=1; i<=n; i++){
        fscanf(fin, "%d", &rmq[0][i]);
    }
    k=0;
    for(i=1; i<=n; i++){
        if(i>=(2<<k)){
            k++;
        }
        lg[i]=k;
    }
    for(i=1; i<=lg[n]; i++){
        for(j=1; j<=n; j++){
            if(j>=(1<<i)){
                rmq[i][j]=min(rmq[i-1][j], rmq[i-1][j-(1<<(i-1))]);
            }
        }
    }
    for(i=1; i<=q; i++){
        fscanf(fin, "%d%d", &a, &b);
        L=lg[b-a+1];
        fprintf(fout, "%d\n", min(rmq[L][b], rmq[L][a+(1<<L)-1]));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}