Cod sursa(job #1754320)

Utilizator florinpocolPocol Florin florinpocol Data 7 septembrie 2016 21:43:40
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#include <stdlib.h>

#define NMAX 100002
#define LMAX 18

long int rmq[LMAX][NMAX];
long int n,m;
long int a[NMAX];
long int lg[NMAX];


int min(int a,int b)
{
    if (a<=b)
       return(a);
       else return(b);
}



int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);

    long int i,j,l;

    scanf("%ld %ld",&n,&m);


    lg[1]=0;
    for (i=2;i<=n;i++)
        lg[i]=lg[i/2]+1;


    for (i=1;i<=n;i++)
        scanf("%ld ",&a[i]);


    for (i=1;i<=n;i++)
        rmq[0][i]=a[i];

    for (i=1; (1 << i) <=n;i++)
           {
                for (j=1;j <= n - (1 << i)+1;j++)
                {
                l=1<<(i-1);
                //printf("%d\n",l);
                rmq[i][j]= min( rmq[i-1][j] , rmq[i-1][j+l] );
                }
                //printf("\n");
           }

    long int x,y,diff,sh;

    for (i=1;i<=m;i++)
    {
         scanf("%ld %ld",&x,&y);

        diff=y-x+1;    //lungimea intervalului necesar de comparare
        l=lg[diff];
        sh=diff - (1<<l);   //ideea intregului algoritm
        //printf("%d %d  ||  %d %d     ",l,x,l,x+sh);
        printf("%ld\n",min(rmq[l][x],rmq[l][x+sh]) );
    }

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


    return 0;
}