Cod sursa(job #868213)

Utilizator CS-meStanca Marian Ciprian CS-me Data 30 ianuarie 2013 20:00:32
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>
FILE *fin=fopen("rmq.in","r");
FILE *fout=fopen("rmq.out","w");

int a[100010][18],v[100010], F[100010];
int n , m, j, p, i, x, y, sol, k;

int minim(int a, int b){
    if(a<b) return a;
    return b;
}

int main(){

    fscanf(fin,"%d %d",&n,&m);

    for(i = 1; i<=n; i++){
        fscanf(fin,"%d",&v[i]);
        a[i][0]=v[i];
    }

    for(j=1,p=2 ; p<2*n; j++,p*=2 ){
        for(i=1;i<=n;i++){
            a[i][j]=minim( a[i][j-1], a[i+p/2][j-1] );
        }
    }

    /*for(i=1;i<=n;i++){
        for(k=0;k<j;k++){
            printf("%d ",a[i][k]);
        }
        printf("\n");
    }*/

    F[1]=0;
    for(i=2;i<=n;i++){
        F[i]=F[i/2]+1;
    }

    for(;m;--m){
        fscanf(fin,"%d %d",&x,&y);

        k = y-x+1;
        k = F[k];
        sol = minim( a[x][k], a[ y-( 1<<k )+1 ][k] );

        fprintf(fout,"%d\n", sol );
    }



return 0;
}