Pagini recente » Cod sursa (job #1317307) | Cod sursa (job #1170119) | Cod sursa (job #1565275) | Cod sursa (job #2042440) | Cod sursa (job #379863)
Cod sursa(job #379863)
#include <algorithm>
using namespace std;
#define DIM 100001
#define LOG 21
int n, m, a[ DIM ], l[ DIM ], r[ LOG ][ DIM ];
void rmq() {
int i, j;
for( i = 2; i <= n; ++i )
l[ i ] = l[ i>>1 ] + 1;
for( i = 1; i <= n; ++i )
r[ 0 ][ i ] = i;
for( i = 1; ( 1<<i ) <= n; ++i )
for( j = 1; j <= n-( 1<<i )+1; ++j ) {
r[ i ][ j ] = r[ i-1 ][ j ];
if( a[ r[ i-1 ][ j+( 1<<( i-1 ) ) ] ] < a[ r[ i ][ j ] ] )
r[ i ][ j ] = r[ i-1 ][ j+( 1<<( i-1 ) ) ];
}
}
int calc( int x, int y ) {
int dif, log, rez;
dif = y-x+1;
log = l[ dif ];
rez = r[ log ][ x ];
if( a[ r[ log ][ y-( 1<<log )+1 ] ] < a[ rez ] )
rez = r[ log ][ y-( 1<<log )+1 ];
return a[ rez ];
}
int main() {
freopen( "rmq.in", "r", stdin );
freopen( "rmq.out", "w", stdout );
int i, x, y;
scanf( "%d %d", &n, &m );
for( i = 1; i <= n; ++i )
scanf( "%d", &a[ i ] );
rmq();
for( i = 1; i <= m; ++i ) {
scanf( "%d %d", &x, &y );
printf( "%d\n", calc( x, y ) );
}
return 0;
}