Pagini recente » Cod sursa (job #2926136) | Cod sursa (job #3212992) | Cod sursa (job #2635435) | Cod sursa (job #1523777) | Cod sursa (job #1244581)
#include <algorithm>
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int NMAX = 100000;
const int JMAX = 20;
int N,M;
int v[NMAX+1], d[NMAX+1][JMAX-2];
void citire() {
in >> N >> M;
for( int i= 1; i<=N; ++i ) {
in >> v[i];
}
}
void DINAMICA() {
int Jmax= 0;
while( (1<<Jmax) <= N ) ++Jmax;
--Jmax;
for( int j= 0; j<=Jmax; ++j ) {
for( int i= 1; i<=N-(1<<j)+1; ++i ) {
if( j==0 ) {
d[ i ][ j ]= v[ i ];
}
else {
d[ i ][ j ]= min( d[ i ][ j-1 ], d[ i + ( 1<<(j-1) ) ][ j-1 ] );
}
}
}
}
int QUERRY( int x, int y ) {
int lg= y-x+1;
int dt= 0; /// DT = Puterea maxima a lui 2 mai mica sau egala cu LG
while( (1<<dt) <= lg ) ++dt;
--dt;
return ( min( d[ x ][ dt ], d[ y - (1<<dt) + 1 ][ dt ] ) );
}
int main() {
citire();
DINAMICA();
for( int i= 1; i<=M; ++i ) {
int x,y;
in >> x >> y;
out << QUERRY( x,y ) << '\n';
}
return 0;
}