Pagini recente » Cod sursa (job #2471083) | Cod sursa (job #1462647) | Cod sursa (job #1997517) | Cod sursa (job #2255564) | Cod sursa (job #388942)
Cod sursa(job #388942)
/*
* File: main.cpp
* Author: virtualdemon
*
* Created on January 31, 2010, 1:56 PM
*/
#include <fstream>
#define Nmax 100000
#define Log2Nmax 20
/*
*
*/
using namespace std;
int v[Nmax], M[Nmax][Log2Nmax];
inline int min( int x, int y )
{
if( v[x] < v[y] )
return x;
return y;
}
inline int min2( int x, int y )
{x=v[x]; y=v[y];
if( x < y )
return x;
return 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( !n )
rez=-1;
return rez;
}
int main()
{int N, m, k, i, j, x, y;
ifstream in("rmq.in");
in>>N>>m;
for( i=0; i < N; ++i )
{
in>>v[i];
M[i][0]=i;
}
for( j=1; (1<<j) <= N; ++j )
{
for( i=0; i+ (1<<j)-1 < N; ++i )
M[i][j]=min( M[i][j-1], M[ i+(1<<(j-1)) ][j-1] );
}
ofstream out("rmq.out");
for( i=0; i < m; ++i )
{
in>>x>>y;
k=log2( y-x+1 );
out<<min2( M[x-1][k], M[y-(1<<k)][k] )<<'\n';
}
}