Pagini recente » Cod sursa (job #2447833) | Cod sursa (job #1126541) | Cod sursa (job #576960) | Cod sursa (job #262892) | Cod sursa (job #1043072)
#include <cstdio>
#define MAX_N 100000
#define MAX_LOG 17
int rmq[MAX_LOG][MAX_N];
int log2[MAX_N];
inline int min( int x, int y ) {
return x < y ? x : y;
}
void read( FILE *fin, int &n, int &m ) {
fscanf( fin, "%d%d", &n, &m );
for ( int i = 0; i < n; ++i )
fscanf( fin, "%d", &rmq[0][i] );
}
void gen_rmq( int n ) {
for ( int len = 1; ( 1 << len ) < n; ++len )
for ( int i = 0; i < n; ++i ) {
rmq[len][i] = rmq[len - 1][i];
int half = 1 << ( len - 1 );
if ( i + half < n )
rmq[len][i] = min( rmq[len][i], rmq[len - 1][i + half] );
}
}
void pregen_log2( int n ) {
for ( int i = 2; i < n; ++i )
log2[i] = log2[i >> 1] + 1;
}
int main() {
FILE *fin, *fout;
fin = fopen( "rmq.in", "r" );
int n, m;
read( fin, n, m );
gen_rmq( n );
pregen_log2( n );
fout = fopen( "rmq.out", "w" );
while ( m ) {
int a, b;
fscanf( fin, "%d%d", &a, &b );
--a, --b;
int len = log2[b - a + 1];
printf( "%d %d %d\n", a, b, len );
fprintf( fout, "%d\n", min( rmq[len][a], rmq[len][b - ( 1 << len ) + 1] ) );
--m;
}
fclose( fin );
fclose( fout );
}