Pagini recente » Cod sursa (job #873576) | Cod sursa (job #1259691) | Cod sursa (job #1709038) | Cod sursa (job #2466387) | Cod sursa (job #2480973)
#include <iostream>
#include <fstream>
#define NMAX 100000
#define LGMAX 20
std::ifstream fin ( "rmq.in" );
std::ofstream fout ( "rmq.out" );
int v[NMAX];
class RMQ {
private :
short logs[1 + NMAX];
int rmq[LGMAX][NMAX];
public :
void calculateLogs ( int N ) {
logs[1] = 0;
for ( int i = 2; i <= N; ++i )
logs[i] = 1 + logs[i / 2];
}
public :
void calculateRMQ ( int N ) {
for ( int i = 0; i < N; ++i )
rmq[0][i] = v[i];
for ( int i = 1; i <= logs[N]; ++i )
for ( int j = 0; j <= N - ( 1 << i ); ++j )
rmq[i][j] = std::min ( rmq[i - 1][j], rmq[i - 1][j + ( 1 << ( i - 1 ) )] );
}
public :
int minInterval ( int left, int right ) {
int l = logs[right - left + 1];
return std::min ( rmq[l][left], rmq[l][right - ( 1 << l ) + 1] );
}
};
int main () {
int N, Q;
fin >> N >> Q;
for ( int i = 0; i < N; ++i )
fin >> v[i];
RMQ* p = new RMQ();
p -> calculateLogs ( N );
p -> calculateRMQ ( N );
for ( int i = 0; i < Q; ++i ) {
int left, right;
fin >> left >> right;
--left;
--right;
fout << p -> minInterval ( left, right ) << '\n';
}
free ( p );
return 0;
}