Pagini recente » Cod sursa (job #2006821) | Statistici Saru George (Georgica03) | Statistici Andrus Ovidiu (OvidiuAndrus) | Cod sursa (job #1113633) | Cod sursa (job #2782968)
#include <fstream>
#include <cmath>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int pre[100001][19];
int find_min(int start, int end) {
int len = end - start + 1;
if(len == 1) return pre[start][0];
int pow = floor(log2(len));
if ((len & (len - 1)) == 0) {
return pre[start][pow];
}
while (len & (len - 1)) {
len = len & (len - 1);
}
return min(pre[start][pow], find_min(start + len, end));
}
void compute_pre(int n) {
for(int j = 1; j <= ceil(log2(n)); ++j) {
int len = 1 << (j - 1);
for(int i = 0; i < n; ++i) {
pre[i][j] = (i + len < n) ? min(pre[i][j - 1], pre[i + len][j - 1]) : pre[i][j - 1];
}
}
}
void read() {
int n, q;
in >> n >> q;
for(int i = 0; i < n; ++i) {
in >> pre[i][0];
}
compute_pre(n);
int a, b;
for(; q; --q) {
in >> a >> b;
--a; --b;
out << find_min(a, b) << '\n';
}
}
int main() {
read();
return 0;
}