Pagini recente » Cod sursa (job #2668207) | Cod sursa (job #399676) | Cod sursa (job #2938081) | Cod sursa (job #572319) | Cod sursa (job #1129647)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int maxn = 1e5 + 5;
int n, m;
vector<int> v, aib;
inline int lsb(int x) {
return (x & (-x));
}
void update(int poz, int value) {
while(poz <= n) {
aib[poz] = min(aib[poz], value);
poz += lsb(poz);
}
}
int query(int a, int b) {
int ans = maxn;
while(b != a) {
if(b - lsb(b) >= a) {
ans = min(ans, aib[b]);
b -= lsb(b);
} else {
ans = min(ans, v[b]);
b--;
}
}
ans = min(ans, v[a]);
return ans;
}
int main() {
#ifdef INFOARENA
ifstream cin("rmq.in");
ofstream cout("rmq.out");
#endif
cin >> n >> m;
v = vector<int> (n + 1, 0);
aib = vector<int> (n + 1, maxn);
for(int i = 1; i <= n; ++i) {
cin >> v[i];
update(i, v[i]);
}
for(int i = 1; i <= m; ++i) {
int a, b; cin >> a >> b;
cout << query(a, b) << "\n";
}
}