Pagini recente » Cod sursa (job #2594094) | Cod sursa (job #69616) | Cod sursa (job #1603402) | Cod sursa (job #2678383) | Cod sursa (job #3134102)
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
const int MAXN = 100000;
const int MAX = 20;
int rmq[MAXN][MAX];
int n, m;
ifstream f("rmq.in");
ofstream g("rmq.out");
void readArray() {
for (int i = 0; i < n; i++) {
f >> 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] = 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 min(firstHalf, secondHalf);
}
int main() {
int startIndex, endIndex;
f >> n >> m;
readArray();
buildSegmentTree();
for (int i = 0; i < m; i++) {
f >> startIndex >> endIndex;
startIndex--;
endIndex--;
g << query(startIndex, endIndex) << endl;
}
return 0;
}