Pagini recente » Cod sursa (job #2754081) | Cod sursa (job #93563) | Cod sursa (job #1918503) | Cod sursa (job #2491031) | Cod sursa (job #2777803)
#include <iostream>
#include <cstdio>
using namespace std;
const int NMAX = 100001;
int A[NMAX], M[NMAX][17];
int lg2[NMAX];
int main()
{
freopen ( "rmq.in", "r", stdin );
freopen ( "rmq.out", "w", stdout );
int n, m;
int i, j;
int st, dr;
int lg;
scanf ( "%d%d", &n, &m );
for ( i = 1; i <= n; i ++ )
scanf ( "%d", &A[i] );
for ( i = 1; i <= n; i ++ )
M[i][0] = i; /// pentru lungime 1
for ( i = 2; i <= n; i ++ )
lg2[i] = 1 + lg2[i >> 1];
for ( j = 1; 1 << j <= n; j ++ ){
for ( i = 1; i + ( 1 << j ) - 1 <= n; i ++ )
if ( A[M[i][j-1]] < A[M[i + ( 1 << ( j - 1 ) ) ][j - 1]] ) /// comparam pratic cele 2 jumatati ale inetervalului actual
M[i][j] = M[i][j-1];
else
M[i][j] = M[i + ( 1 << ( j - 1 ) )][j - 1];
}
for ( i = 1; i <= m; i ++ ){
scanf ( "%d%d", &st, &dr );
lg = lg2[dr-st+1];
if ( A[M[st][lg]] <= A[M[dr - ( 1 << lg ) + 1][lg]] )
printf ( "%d\n", A[M[st][lg]] );
else
printf ( "%d\n", A[M[dr - ( 1 << lg ) + 1][lg]] );
}
return 0;
}