Pagini recente » Cod sursa (job #2710286) | Cod sursa (job #3139542) | Cod sursa (job #340535) | Cod sursa (job #1955290) | Cod sursa (job #1604214)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX = 100000;
const int MMAX = 100000;
const int H = 18;
int n; int m;
int rmq[H][NMAX + 1];//rmq[i][j] = min(v[j]...v[j + 2^i - 1]) inclusiv
int lg[NMAX + 1];//lg[i] = cel mai mare nr ai 2^lg[i] <= i
void constructRmq() {
for(int i = 1; (1 << i) <= n; ++i)
for(int j = 1; j + (1 << i) - 1 <= n ; ++j)
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1) )]);
}
int query(int left, int right) {
int dim = right - left + 1;
int lgDim = lg[dim];
return min(rmq[lgDim][left], rmq[lgDim][right - (1<<lgDim) + 1]);
}
int main() {
fin >> n >> m;
for(int i = 1; i <= n; ++i)
fin >> rmq[0][i];
constructRmq();
lg[1] = 0;
for(int i = 2 ; i <= n ; ++i)
lg[i] = lg[i / 2] + 1;
while(m--) {
int left; int right;
fin >> left >> right;
fout << query(left, right) << '\n';
}
return 0;
}