Cod sursa(job #1130058)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 28 februarie 2014 11:04:26
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<cstdio>
int n,q,a,b,x,pp,i,j,v[100100],p[100100],d[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,&q);
    p[1]=0;
    for(i=1;i<=100000;i++){
        p[i]=p[i/2]+1;
    }
    for(i=1;i<=n;i++){
        fscanf(f,"%d",&d[0][i]);
    }
    for(i=1;i<=p[n];i++){
        x=1<<(p[i]-1);
        for(j=1;j<=n;j++){
            if(d[i-1][j+x]>0)
                d[i][j]=minim(d[i-1][j],d[i-1][j+x]);
            else
                d[i][j]=d[i-1][j];
        }
    }
    for(i=1;i<=q;i++){
        fscanf(f,"%d%d",&a,&b);
        x=b-a+1;
        pp=1<<(p[x]-1);
        fprintf(g,"%d\n",minim(d[p[x]-1][a],d[p[x]-1][b-pp+1]));
    }



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