Pagini recente » Cod sursa (job #3250506) | Cod sursa (job #715685) | Cod sursa (job #2325987) | Cod sursa (job #827421) | Cod sursa (job #3134188)
#include <iostream>
#include <cmath>
#include <fstream>
const int MAXN = 100000;
const int MAX = 20;
int rmq[MAXN][MAX];
int n, m;
void readArray(std::ifstream& fin) {
for (int i = 0; i < n; i++) {
fin >> rmq[i][0];
}
}
void buildSegmentTree() {
for (int j = 1; pow(2, j) <= n; j++) {
for (int i = 0; i + pow(2, j) <= n; i++) {
int firstHalf = rmq[i][j - 1];
int secondHalf = rmq[i + (int)pow(2, j - 1)][j - 1];
rmq[i][j] = std::min(firstHalf, secondHalf);
}
}
}
int query(int f, int l) {
int len = l - f + 1;
int k = (int)log2(len);
int firstHalf = rmq[f][k];
int secondHalf = rmq[l - (int)pow(2, k) + 1][k];
return std::min(firstHalf, secondHalf);
}
int main() {
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
fin >> n >> m;
readArray(fin);
buildSegmentTree();
for (int i = 0; i < m; i++) {
int startIndex, endIndex;
fin >> startIndex >> endIndex;
startIndex--;
endIndex--;
fout << query(startIndex, endIndex) << std::endl;
}
fin.close();
fout.close();
return 0;
}