Pagini recente » Istoria paginii runda/acs_pc_2017-2018_winter_break_1231413232 | Diferente pentru utilizator/rodik_rody intre reviziile 40 si 41 | Cod sursa (job #401066) | Cod sursa (job #2014840) | Cod sursa (job #2247448)
#include <iostream>
#include <cstdio>
using namespace std;
#define NMAX 100005
#define INFI 0x3f3f3f3f
#define LGMAX 17
int D[ LGMAX ][ NMAX ];
int logaritm ( int k ) {
int i = 1, s = 0;
while ( i < k ) {
s++;
i *= 2;
}
return s;
}
int main () {
freopen( "rmq.in", "r", stdin );
freopen( "rmq.out", "w", stdout );
int n, m, i, j, k, ln, lg, ma, st, dr;
scanf( "%d%d", &n, &m );
for ( i = 0; i <= LGMAX; ++i ) {
for ( j = 0; j <= n; ++j ) D[ i ][ j ] = INFI;
}
for ( i = 1; i <= n; ++i ) scanf( "%d", &D[ 0 ][ i ] );
for ( i = 1; i <= LGMAX; ++i ) {
k = 1 << i;
for ( j = 1; j + k <= n; ++j ) {
D[ i ][ j ] = min( D[ i - 1 ][ j ], D[ i - 1 ][ j + k / 2 + 1 ] );
}
}
while ( m-- ) {
scanf( "%d%d", &st, &dr );
ln = dr - st;
lg = logaritm ( ln );
printf( "%d\n", min( D[ lg ][ st ], D[ lg ][ dr - ( 1 << lg ) ] ) );
}
return 0;
}