Cod sursa(job #1932466)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 19 martie 2017 19:57:09
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>
#define N 100005
#define log 18

int n,m,i,j,q,x,y,ans,p;
int rmq[log][N],log2[N],p2[log];


void init()
{
    p2[0]=1;
    for(i=1;i<log;i++)
        p2[i]=p2[i-1]*2;
}
int min(int a,int b)
{
    if(a<b)
        return a;
    return b;
}
int main()
{
    FILE *f1,*f2;
    f1=fopen("rmq.in","r");
    f2=fopen("rmq.out","w");

    init();
    fscanf(f1,"%d%d",&n,&m);

    q=1;
    for(i=1;i<=n;i++)
    {
        fscanf(f1,"%d",&rmq[0][i]);

        log2[i]=log2[i-1];
        if(i>p2[q])
        {
            log2[i]++;
            q++;
        }
    }

    for(j=1;p2[j]<=n;j++)
    {
        for(i=1;i<=n;i++)
        {
            y=min(n,i+p2[j-1]);
            rmq[j][i]=min(rmq[j-1][i],rmq[j-1][y]);
        }
    }

    /*for(j=0;p2[j]<=n;j++)
    {
        for(i=1;i<=n;i++)
            printf("%d ",rmq[j][i]);
        printf("\n");
    }*/

    //for(i=1;i<=n;i++)
    //    printf("%d ",log2[i]);

    for(i=0;i<m;i++)
    {
        fscanf(f1,"%d%d",&x,&y);

        p=log2[y-x+1];

        ans=min(rmq[p][x],rmq[p][y-p2[p]+1]);

        //printf("%d %d %d %d \n",x,y,p,p2[p]);

        fprintf(f2,"%d\n",ans);
    }

    return 0;
}