Cod sursa(job #1213453)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 28 iulie 2014 10:49:10
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<cstdio>
int n,m,i,j,x[20][100100],a,b,q,d,p[100010];
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");
    p[1]=0;
    for(i=1;i<=100000;i++){
        p[i]=p[i/2]+1;
    }
    fscanf(f,"%d%d",&n,&m);
    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;
}