Pagini recente » Cod sursa (job #501568) | Cod sursa (job #2289487) | Cod sursa (job #2423966) | Cod sursa (job #2039725) | Cod sursa (job #2118614)
#include <fstream>
#define MAXN 100005
#define MAXM 18
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, Q, rmq[MAXM][MAXN];
int log[MAXN], lg, M;
inline void Read() {
fin >> N >> Q;
for (int i = 1; i <= N; i++) {
fin >> rmq[0][i];
}
log[1] = log[0] = 0;
for (int i = 2; i <= N; i++)
log[i] = log[i / 2] + 1;
}
inline void ConstructRMQ() {
M = log[N];
for (int i = 1; i <= M; i++) {
for (int j = 1; j + (1 << i) - 1 <= N; j++) { ///daca de pe poz j incepand mai am cel putin 2 la i elemente
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
}
}
}
inline void Solve() {
int a, b;
while (Q--) {
fin >> a >> b;
lg = log[b - a + 1];
fout << min(rmq[lg][a], rmq[lg][b - (1 << lg) + 1]) << "\n";
}
}
int main () {
Read();
ConstructRMQ();
Solve();
fin.close(); fout.close(); return 0;
}