Pagini recente » Cod sursa (job #1543293) | Cod sursa (job #1196767) | Cod sursa (job #3125325) | Cod sursa (job #45235) | Cod sursa (job #373252)
Cod sursa(job #373252)
#include <stdio.h>
#define in "rmq.in"
#define out "rmq.out"
#define NMAX 100005
#define MMAX 18
long dp[NMAX][MMAX];
long N, M;
long A[NMAX], lg[NMAX];
int main ( void )
{
freopen ( in, "r", stdin );
freopen ( out, "w", stdout );
scanf ( "%ld%ld", &N, &M );
int i, j;
long X, Y, k;
for ( i = 0; i < N; scanf( "%ld", A+i++ ) );
lg[1] = 0;
for ( i = 2; i < N; ++i ) lg[i] = lg[(i>>1)]+1;
for ( i = 0; i < N; ++i )
dp[i][0] = i;
for ( j = 1; (1<<j) <= N; ++j )
for ( i = 0; i + (1<<j)-1 < N; ++i )
if ( A[dp[i][j-1]] < A[dp[i+(1<<(j-1))][j-1]] )
dp[i][j] = dp[i][j-1];
else
dp[i][j] = dp[i+(1<<(j-1))][j-1];
for ( ; M; --M )
{
scanf ( "%ld%ld", &X, &Y );
X--; Y--;
k = lg[Y-X+1];
if ( A[dp[X][k]] < A[dp[Y-(1<<k)+1][k]] )
printf ( "%ld\n", A[dp[X][k]] );
else
printf ( "%ld\n", A[dp[Y-(1<<k)+1][k]] );
}
return 0;
}