Cod sursa(job #390783)

Utilizator alexandru92alexandru alexandru92 Data 4 februarie 2010 16:11:34
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.17 kb
/* 
 * File:   main.c
 * Author: virtualdemon
 *
 * Created on February 4, 2010, 3:46 PM
 */
#include <stdio.h>
#define Nmax 100000
#define Log2Nmax 17

/*
 *
 */
inline int min( int x, int y )
{
    if( x < y )
        return x;
    return y;
}
inline int Log2( int n )
{
    if( n <= 1 )
        return ( n ? 0 : -1 );
    int rez=0;
    if( n >= 1<<16 )
        n>>=16, rez+=16;
    if( n >= 1<<8 )
        n>>=8, rez+=8;
    if( n >= 1<<4 )
        n>>=4, rez+=4;
    if( n >= 1<<2 )
        n>>=2, rez+=2;
    if( n >= 1<<1 )
        rez+=1;
    return rez;
}
int main( void )
{
    int RMQ[Nmax][Log2Nmax];
    int n, Log2N, m, i, id, till, j, k;
    freopen("rmq.in", "rt", stdin );
    scanf("%d%d", &n, &m );
    for( i=0; i < n; ++i )
        scanf("%d", *(RMQ+i) );
    Log2N=Log2(n);
    for( j=1; j <= Log2N; ++j )
    {
        id=(1<<(j-1));
        till=n-(1<<j)+1;
        for( i=0; i < till; ++i )
            RMQ[i][j]=min( RMQ[i][j-1], RMQ[i+id][j-1] );
    }
    freopen( "rmq.out", "wt", stdout );
    for( ; m; --m )
    {
        scanf("%d%d", &i, &j );
        k=Log2( j-i+1 );
        i-=1; 
        printf("%d\n", min( RMQ[i][k], RMQ[j-(1<<k)][k] ) );
    }
    return 0;
}