Pagini recente » Cod sursa (job #3248017) | Cod sursa (job #1623481) | Cod sursa (job #3354518) | Cod sursa (job #1798379) | Cod sursa (job #3313487)
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int NMAX = 1e5 + 5;
const int LOGMAX = 18;
int sp[LOGMAX][NMAX], lg[NMAX];
// sp[j][i] = min pentru intervalul care incepe la i
// si are lungimea 2 ^ j
int n, q;
void buildRmq() {
for (int i = 1; i <= n; i++) {
cin >> sp[0][i];
}
for (int i = 2; i <= n; i++) {
lg[i] = lg[i / 2] + 1;
}
for (int j = 1; j < LOGMAX; j++) { // 1 << j este lungimea
for (int i = 1; (i + (1 << j) - 1) <= n; i++) { // capatul stanga
sp[j][i] = min(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))]);
}
}
}
int query(int l, int r) {
int lng = r - l + 1;
return min(sp[lg[lng]][l], sp[lg[lng]][r - (1 << lg[lng]) + 1]);
}
int main()
{
cin >> n >> q;
buildRmq();
while (q--) {
int l, r;
cin >> l >> r;
cout << query(l, r) << '\n';
}
return 0;
}