Cod sursa(job #215505)

Utilizator alexeiIacob Radu alexei Data 19 octombrie 2008 11:14:55
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<stdio.h>
#define NMAX 100024
#define LogN 20

int A[NMAX],LG[NMAX];
int RMQ[LogN][NMAX];
inline int min(const int a,const int b){return a<b?a:b; }
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    
    int N,M;
    scanf("%d%d",&N,&M);
    
    int i,j;
    for(i=1; i<=N; ++i){
             scanf("%d\n",&A[i]);
             if( i!=1 )
                 LG[i]=LG[i>>1]+1;
             RMQ[0][i]=A[i];
    }
    int a1,a2;
    for(i=1; (1<<i) <=N; ++i)
    {
            a1=N-(1<<i)+1; 
            for(j=1; j<=a1; ++j)
            {
            a2=1<<(i-1);
            RMQ[i][j]=min( RMQ[i-1][j], RMQ[i-1][j+a2] );
            }
    }
    
    int a3,a4,dif;
    while( M-- )
    {
           scanf("%d%d\n",&a1,&a2);
           dif=a2-a1+1;
           a3=LG[dif];a4=a1+dif-(1<<a3);
           printf("%d\n",min( RMQ[a3][a1], RMQ[a3][a4] ));
    }
return 0;
}