Pagini recente » Cod sursa (job #2447407) | Cod sursa (job #2708214) | Cod sursa (job #2748154) | Cod sursa (job #1191416) | Cod sursa (job #2349212)
#include <iostream>
#include <fstream>
using namespace std;
const int MAXN = 100010, LOGN = 12;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, q, matrix[LOGN][MAXN], log[MAXN];
/// i -> 2 la puterea i = numarul de elemente in interval
/// j -> pozitia de la care incepe intervalul
inline int doMin(int a, int b) {
if (a < 1)
return b;
if (b < 1)
return a;
return (a < b ? a : b);
}
void fillMatrix() {
for (int i = 1; (1 << i) <= n; i++) {
for (int j = 0; j + (1 << i) - 1 < n; j++) {
matrix[i][j] = doMin(matrix[i - 1][j], matrix[i - 1][j + (1 << (i - 1))]);
}
}
}
void fillLog() {
for (int i = 2; i <= n; i++)
log[i] = log[i - 1] + (i % 2 == 0);
}
int doRmq(int l, int r) {
int k = log[r - l + 1];
return doMin(matrix[k][l], matrix[k][r - (1 << k) + 1]);
}
int main() {
fin >> n >> q;
for (int j = 0; j < n; j++)
fin >> matrix[0][j];
fillMatrix();
fillLog();
for (int i = 1 ; i <= q; i++) {
int l, r;
fin >> l >> r;
fout << doRmq(l - 1 , r - 1) << "\n";
}
return 0;
}