Cod sursa(job #1487452)

Utilizator DeltaMTP Dragos DeltaM Data 16 septembrie 2015 21:34:53
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<cstdio>
int n,m,i,j,a,b,q,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=2;i<=100000;i++){
        p[i]=p[i/2]+1;
    }
    for(i=1;i<=n;i++){
        fscanf(f,"%d",&x[0][i]);
    }
    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);
        q=b-a+1;
        d=1<<(p[q]-1);
        fprintf(g,"%d\n",minim( x[ p[q] - 1 ][a], x[ p[q] - 1 ][ b-d+1 ] ) );
    }
    fclose(f);
    fclose(g);
    return 0;
}