Pagini recente » Cod sursa (job #3260512) | Cod sursa (job #1108629) | Cod sursa (job #3202901) | Cod sursa (job #472559) | Cod sursa (job #1604210)
#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];//rmq[i][j] = min(v[j]...v[j + 2^i - 1]) inclusiv
int lg[NMAX];//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 sol = 0x7fffffff;
int dim = right - left + 1;
int ind = lg[dim];
for(int i = ind; i >= 0; --i) {
if(right >= left + (1 << i) - 1) {
sol = min(sol, rmq[i][left]);
left += (1 << i);
}
}
return sol;
}
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;
}