Pagini recente » Cod sursa (job #3241930) | Cod sursa (job #2890066) | Cod sursa (job #2209386) | Cod sursa (job #711253) | Cod sursa (job #3266492)
#include <bits/stdc++.h>
using namespace std;
const int LIMIT = 30,
NMAX = 100003;
int rmq[LIMIT][NMAX], loga[NMAX];
void precalc(const int &n) {
for(int put = 1; (1 << put) <= n; put++) {
/// practic noi vom parcurge puterile // secventele si vom alege minimul din diagonala precedent sau urmatorul din fata
for(int i = 1; i <= n;i++) {
rmq[put][i] = rmq[put - 1][i];
int nextput = i + (1 << (put - 1));
if(nextput <= n && rmq[put-1][nextput] < rmq[put][i]) {
rmq[put][i] = rmq[put-1][nextput];
}
}
}
// mai avem nevoie sa calculam logaritimii
for(int i = 2; i <= n;i++) {
loga[i] = loga[i / 2] + 1;
}
}
int32_t getMinim(int left, int right) {
int exp = loga[right - left + 1];
int len = (1 << exp);
return min(rmq[exp][left], rmq[exp][right - len + 1]);
}
int32_t main(void) {
ofstream cout("rmq.out");
ifstream cin("rmq.in");
int n, Q;
cin >> n >> Q;
for(int i = 1;i <= n;i++) {
/// noi oricum precalculam minimurile pe secvente puteri de 2, asadar 2 ^ 0 = 1
cin >> rmq[0][i]; /// minimul pentru el insusi este chiar el
}
precalc(n);
while(Q--) {
int left, right;
cin >> left >> right;
cout << getMinim(left, right) << '\n';
}
}