Pagini recente » Autentificare | Cod sursa (job #1151206) | Cod sursa (job #1428087) | Cod sursa (job #508628) | Cod sursa (job #1823945)
#include <bits/stdc++.h>
using namespace std;
vector<int> Link;
int Find(int x) {
if(Link[x] != -1)
return Link[x] = Find(Link[x]);
return x;
}
struct Query {
int a, b, i;
};
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, m;
cin >> n >> m;
vector<int> Val(n), Ans(m);
for(auto &v : Val)
cin >> v;
vector<Query> Qs(m);
int at = 0;
for(auto &p : Qs) {
cin >> p.a >> p.b;
p.a--;
p.i = at++;
}
Link.resize(n, -1);
sort(Qs.begin(), Qs.end(), [](Query a, Query b) {
return a.b < b.b;
});
vector<int> St;
at = 0;
for(auto &q : Qs) {
while(at < q.b) {
while(!St.empty() && Val[St.back()] >= Val[at]) {
Link[St.back()] = at;
St.pop_back();
}
St.push_back(at++);
}
Ans[q.i] = Val[Find(q.a)];
}
for(auto &a : Ans)
cout << a << '\n';
return 0;
}