Pagini recente » Cod sursa (job #1883997) | Cod sursa (job #2955932) | Cod sursa (job #390668) | Cod sursa (job #1908367) | Cod sursa (job #2545085)
using namespace std;
#define fisier "rmq"
#ifdef fisier
#include <fstream>
ifstream in(fisier ".in");
ofstream out(fisier ".out");
#else
#include <iostream>
#define in cin
#define out cout
#endif
const int
MAX_N = 100000,
LOG2_MAX_N = 17;
int n, m, d[LOG2_MAX_N][MAX_N], doi_la[32];
int log2(int x) {
int i = 0, j = 31, mij;
while (i <= j) {
mij = (i + j) / 2;
if (doi_la[mij] <= x) {
i = mij + 1;
} else {
j = mij - 1;
}
}
if (j == -1) {
return 0;
}
return j;
}
void constr_puteri_doi() {
*doi_la = 1;
for (int i = 1; i < 31; i++) {
doi_la[i] = doi_la[i - 1] << 1;
}
}
void constr_d() {
in >> n >> m;
for (int i = 0; i < n; i++) {
in >> (*d)[i];
}
int log2_n = log2(n);
for (int exp = 1; exp <= log2_n; exp++) {
int
prev_lun = doi_la[exp - 1],
start_cap = n - prev_lun;
for (int start = 0; start < n; start++) {
d[exp][start] = d[exp - 1][start];
if (start < start_cap) {
d[exp][start] = min(d[exp][start], d[exp - 1][start + prev_lun]);
}
}
}
}
int main() {
constr_puteri_doi();
constr_d();
int x, y, log2_lun;
while (m--) {
in >> x >> y;
x--; y--;
log2_lun = log2(y - x);
out << min(d[log2_lun][x], d[log2_lun][y - doi_la[log2_lun]]) << '\n';
}
}
/// chiar nu ma asteptam sa mearga codul la prima incercare
// edit: nu merge defapt
// edit: acum cred ca merge
//