Pagini recente » Cod sursa (job #1907313) | Cod sursa (job #174790) | Cod sursa (job #3281433) | Cod sursa (job #834029) | Cod sursa (job #1443849)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f ("rmq.in");
ofstream g ("rmq.out");
const int NMAX = 100000 + 1;
const int LOG2 = 17;
int n, m;
int lg2[NMAX];
int rmq[LOG2][NMAX];
void citeste() {
f >> n >> m;
for (int i = 1; i <= n; i++) f >> rmq[0][i];
}
void precalculeaza() {
for (int i = 2; i <= n; i++) lg2[i] = lg2[i / 2] + 1;
for (int p = 1; (1 << p) <= n; p++) {
int lg = (1 << (p - 1));
for (int j = 1; j <= n - lg + 1; j++) {
rmq[p][j] = min(rmq[p - 1][j], rmq[p - 1][j + lg]);
}
}
}
void rezolva() {
int a, b;
for (int i = 1; i <= m; i++) {
f >> a >> b;
int lg = lg2[b - a + 1];
b = b + 1 - (1 << lg);
g << min(rmq[lg][a], rmq[lg][b]) << '\n';
}
}
int main() {
citeste();
precalculeaza();
rezolva();
return 0;
}