Pagini recente » Cod sursa (job #2976771) | Cod sursa (job #2780418) | Cod sursa (job #415653) | Cod sursa (job #1657998) | Cod sursa (job #390783)
Cod sursa(job #390783)
/*
* 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;
}