Cod sursa(job #1015675)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 24 octombrie 2013 22:25:11
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<cstdio>
int n,m,d[21][100001],i,j,st,dr,p[100001],x,y;
FILE *f,*g;
int main(){
    f=fopen("rmq.in","r");
    g=fopen("rmq.out","w");
    fscanf(f,"%d%d",&n,&m);
    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<<(i-1));
        for(j=1;j<=n;j++){
            if(d[i-1][j]>d[i-1][j+x] && d[i-1][j+x]>0)
                d[i][j]=d[i-1][j+x];
            else
                d[i][j]=d[i-1][j];
        }
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d",&st,&dr);
        x=dr-st+1;
        y=(1<<p[x]-1);
        if(d[p[x]-1][st]<d[p[x]-1][dr-y+1])
            fprintf(g,"%d\n",d[p[x]-1][st]);
        else
            fprintf(g,"%d\n",d[p[x]-1][dr-y+1]);
    }
    fclose(f);
    fclose(g);
    return 0;
}