Pagini recente » Cod sursa (job #1364329) | Cod sursa (job #1861594) | Cod sursa (job #2299384) | Cod sursa (job #2264130) | Cod sursa (job #2782986)
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int pre[100001][19];
int max_pow = 0;
int find_min(int start, int end) {
int len = end - start + 1;
if(len == 1) return pre[start][0];
int pow = min((int)floor(log2(len)), max_pow);
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) {
int len, aux;
bool ch;
for(int j = 1; j <= ceil(log2(n)); ++j) {
len = 1 << (j - 1);
ch = false;
for(int i = 0; i < n; ++i) {
aux = pre[i][j - 1];
pre[i][j] = (i + len < n) ? min(pre[i][j - 1], pre[i + len][j - 1]) : pre[i][j - 1];
ch = aux != pre[i][j] || ch;
}
if (!ch) {
return;
}
max_pow = j;
}
}
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();
/* for(int j = 0; j < 17; ++j) {*/
/* for(int i = 0; i < 20; ++i) {*/
/* cout << pre[i][j] << ' ';*/
/* }cout << endl;}*/
/* cout << log2(20) << endl;*/
/* cout << max_pow << endl;*/
return 0;
}