Pagini recente » Cod sursa (job #391479) | Cod sursa (job #83675) | Cod sursa (job #155325) | Cod sursa (job #389038)
Cod sursa(job #389038)
/*
* File: main.cpp
* Author: virtualdemon
*
* Created on January 31, 2010, 1:56 PM
*/
#include <fstream>
#define Nmax 100000
#define Log2Nmax 19
/*
*
*/
using namespace std;
int RMQ[Nmax][Log2Nmax];
inline int min( int x, int y )
{
return y^( (x^y) & -(x<y) );
}
inline int Log2( int n )
{
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;
if( !rez )
rez=-1;
return rez;
}
int main()
{int n, m, i, j, c, c2, log2l;
ifstream in("rmq.in");
in>>n>>m;
for( i=0; i < n; ++i )
in>>RMQ[i][0];
for( j=1; (1<<j) <= n; ++j )
{ c2=(1<<j);
c=(1<<(j-1));
for( i=0; i+c2-1 < n; ++i )
RMQ[i][j]=min( RMQ[i][j-1], RMQ[i+c][j-1] );
}
ofstream out("rmq.out");
for( c=1; c <= m; ++c )
{
in>>i>>j;
log2l=Log2( j-i+1 );
out<<min( RMQ[i-1][log2l], RMQ[j-(1<<(log2l))][log2l] )<<'\n';
}
return 0;
}