Pagini recente » Istoria paginii utilizator/racareanudragos | Cod sursa (job #1049271) | Cod sursa (job #223497) | Cod sursa (job #2071593) | Cod sursa (job #1193340)
#include <cstdio>
#define MAXN 100000
#define LG 19
int RMQ[MAXN][LG];
int v[MAXN];
int log[MAXN+1];
inline int min( int a, int b ) {
return a < b ? a : b;
}
int main () {
FILE *f, *g;
f = fopen( "rmq.in", "r" );
g = fopen( "rmq.out", "w" );
int n, m;
fscanf( f, "%d%d", &n, &m );
for( int i = 0 ; i < n ; ++i )
fscanf( f, "%d", &v[i] );
log[1] = 0;
for( int i = 2 ; i <= n ; ++i )
log[i] = log[i>>1] + 1;
for( int i = 0 ; i < n ; ++i )
RMQ[i][0] = v[i];
for( int l = 1 ; (1 << l) <= n ; ++l )
for( int i = 0 ; i + ( 1<<l ) - 1 < n ; ++i ) {
int len = ( 1<<(l-1) );
RMQ[i][l] = min( RMQ[i][l-1], RMQ[i+len][l-1] );
}
int x, y;
for( int i = 0 ; i < m ; ++i ) {
fscanf( f, "%d%d", &x, &y );
--x;
--y;
int diff = y - x + 1;
int lg = log[diff];
int rest = diff - ( 1 << lg );
fprintf( g, "%d\n", min( RMQ[x][lg], RMQ[x+rest][lg] ) );
}
fclose( f );
fclose( g );
return 0;
}