Cod sursa(job #441397)
// Simionescu Andrei, -/-/2010
// http://infoarena.ro/problema/rmq
// Dificultate: -
// Categorii: -
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 100002
#define LOGNMAX 18
int n, m;
int A[NMAX], RMQ[LOGNMAX][NMAX], M[NMAX];
int main(){
freopen( "rmq.in", "r", stdin );
freopen( "rmq.out", "w", stdout );
int i, j, k, x, y, aux, aux2;
// input
scanf( "%d %d", &n, &m );
for ( i = 1; i <= n; ++i )
scanf( "%d ", &A[i]);
// initializare
M[1] = 0;
for ( i = 2; i <= n; ++i )
M[i] = M[i/2] + 1;
for ( i = 1; i <= n; ++i )
RMQ[0][i] = A[i];
// preprocesare
for ( i = 1; (1<<i) <= n; ++i )
for ( j = 1; j <= n - (1<<i) + 1; ++j )
{
k = 1<<(i-1);
RMQ[i][j] = min( RMQ[i-1][j] , RMQ[i-1][j+k] );
}
// queries
for ( i = 1; i <= m; ++i )
{
scanf( "%d %d", &x, &y );
aux = y - x + 1;
k = M[aux];
aux2 = aux - (1<<k);
printf( "%d\n", min( RMQ[k][x], RMQ[k][x+aux2] ) );
}
return 0;
}