Pagini recente » Cod sursa (job #3132376) | Cod sursa (job #328518) | Cod sursa (job #1027843) | Cod sursa (job #79799) | Cod sursa (job #1786742)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int const MAX_ROWS = 100001;
int const MAX_COLS = 20;
int N, M, v[MAX_ROWS], rmq[MAX_ROWS][MAX_COLS];
void build_rmq() {
int cols = floor(log2(N)) + 1, rows = N;
for (int i = 0; i < rows; i++) {
rmq[i][0] = i;
}
for (int j = 1; j < cols; j++) {
for (int i = 0; i + (1 << j) - 1 < rows; i++) {
int step = 1 << (j - 1);
int index1 = rmq[i][j - 1], index2 = rmq[i + step][j - 1];
if (v[index1] < v[index2])
rmq[i][j] = index1;
else
rmq[i][j] = index2;
}
}
}
int query(int x, int y) {
int li = min(x, y), ls = max(x, y);
int len = ls - li + 1;
int step = floor(log2(len));
int rem = len - (1 << step);
return min(v[rmq[li][step]], v[rmq[li + rem][step]]);
}
int main() {
ifstream fin("rmq.in");
ofstream fout("rmq.out");
fin >> N >> M;
for (int i = 0; i < N; i++) {
fin >> v[i];
}
build_rmq();
int index1, index2;
for (int i = 0; i < M; i++) {
fin >> index1 >> index2;
fout << query(index1 - 1, index2 - 1) << '\n';
}
fin.close();
fout.close();
return 0;
}