Pagini recente » Cod sursa (job #603655) | Cod sursa (job #2233226) | Cod sursa (job #1086032) | Cod sursa (job #503769) | Cod sursa (job #1813824)
#include<fstream>
#define DIM 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int D[18][DIM], P[DIM], a, b, n, m;
int main(){
fin >> n >> m;
for( int i = 1; i <= n; i++ ){
fin >> D[0][i];
}
//D[k][i] = minimul de pe intervalul ( i, i + 2^k )
//D[k][i] = min ( minimul de pe intervalul ( i, i + 2^(k-1) ), minimul de pe intervalul ( i + 2^(k-1), i + 2^k ) )
for( int k = 1; (1<<k) <= n; k++ ){
for( int i = 1; i + (1<<k) - 1 <= n; i++ ){
D[k][i] = min( D[k - 1][i], D[k - 1][i + (1<<(k-1))] );
}
}
//P[i] = exponentul celei mai mari puteri a lui 2 <= i
P[1] = 0;
for( int i = 2; i <= n; i++ ){
P[i] = P[i / 2] + 1;
}
//query-uri
for( int i = 1; i <= m; i++ ){
fin >> a >> b;
//vad ce putere de 2 <= b - a + 1(lg interval) imi verifica relatia 2^p * 2 >= b - a + 1
//unde p este puterea cautata (exponentul puterii)
int p = P[b - a + 1];
fout << min( D[p][a], D[p][b - (1<<p) + 1] ) << "\n";
}
return 0;
}