Pagini recente » Cod sursa (job #1616260) | Cod sursa (job #781910) | Borderou de evaluare (job #2076263) | Borderou de evaluare (job #1005440) | Cod sursa (job #1977864)
#include <stdio.h>
#include <stdlib.h>
int v[100001];
int r[100001][17];
int log[100001];
int min( int a, int b ) {
return a < b ? a : b;
}
int query( int a, int b ) {
int l = log[b - a + 1];
return min( r[a + ( 1 << l ) - 1][l], r[b][l] );
}
int main() {
FILE *fin, *fout;
int n, m, i, j, a, b;
fin = fopen( "rmq.in", "r" );
fout = fopen( "rmq.out", "w" );
fscanf( fin, "%d%d", &n, &m );
for ( i = 1; i <= n; i++ )
fscanf( fin, "%d", &v[i] );
for ( i = 1; i <= n; i++ ) {
r[i][0] = v[i];
for ( j = 1; ( 1 << j ) <= i; j++ ) {
r[i][j] = min( r[i - ( 1 << ( j - 1 ) )][j - 1], r[i][j - 1] );
}
}
log[1] = 0;
for ( i = 2; i <= n; i++ ) {
log[i] = 1 + log[i / 2];
}
for ( i = 0; i < m; i++ ) {
fscanf( fin, "%d%d", &a, &b );
fprintf( fout, "%d\n", query( a, b ) );
}
fclose( fin );
fclose( fout );
return 0;
}