Pagini recente » Cod sursa (job #1930400) | Cod sursa (job #205708) | Cod sursa (job #50933) | Cod sursa (job #473306) | Cod sursa (job #437034)
Cod sursa(job #437034)
/*
* File: main.cpp
* Author: VirtualDemon
*
* Created on April 9, 2010, 8:52 AM
*/
#include <cstdlib>
#include <fstream>
#define Nmax 100001
#define Log2Nmax 20
/*
*
*/
using namespace std;
int RMQ[Nmax][Log2Nmax];
inline int Log2N( 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 N, log2N, M, till, i, j, k;
ifstream in( "rmq.in" );
in>>N>>M;
for( i=0; i < N; ++i )
in>>RMQ[i][0];
log2N=Log2N(N);
for( j=1; j <= log2N; ++j )
{
k=(1<<(j-1));
till=N-k*2+1;
for( i=0; i < till; ++i )
RMQ[i][j]=min( RMQ[i][j-1], RMQ[i+k][j-1] );
}
ofstream out( "rmq.out" );
for( ; M; --M )
{
in>>i>>j;
k=Log2N( j-i+1 );
out<<min( RMQ[j-(1<<k)][k], RMQ[i-1][k] )<<'\n';
}
return EXIT_SUCCESS;
}