Cod sursa(job #1614641)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 26 februarie 2016 00:44:21
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<cstdio>
int n,m,i,j,a,b,c,d,p[100100],x[20][100100];
FILE *f,*g;
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
int main(){
    f=fopen("rmq.in","r");
    g=fopen("rmq.out","w");
    fscanf(f,"%d%d",&n,&m);

    for(i=1;i<=n;i++){
        fscanf(f,"%d",&x[0][i]);
    }
    for(i=1;i<=100000;i++){
        p[i] = p[ i / 2 ] + 1;
    }
    for(i=1;i<=p[n];i++){
        a = 1 << ( i - 1 );
        for(j=1; j<=n; j++){
            if( j + a <= n ){
                x[i][j] = minim( x[ i - 1 ][j] , x[ i - 1 ][ j + a ] );
            }
            else
                x[i][j] = x[ i - 1 ][j];
        }
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d",&a,&b);
        c = b - a + 1;
        d = 1 << ( p[c] - 1 );
        fprintf(g,"%d\n", minim( x[ p[c] - 1 ][a] , x[ p[c] - 1 ][ b - d + 1 ] ));
    }

    fclose(f);
    fclose(g);
    return 0;
}