Pagini recente » Cod sursa (job #1656397) | Cod sursa (job #1291867) | Cod sursa (job #448566) | Cod sursa (job #1886749) | Cod sursa (job #1823948)
#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
vector<int> Cnt(n + 1, 0);
for(auto &p : Qs)
Cnt[p.b] += 1;
int acc = 0;
for(auto &x : Cnt)
x = (acc += x);
vector<Query> Srt(m);
reverse(Qs.begin(), Qs.end());
for(auto &q : Qs)
Srt[--Cnt[q.b]] = q;
vector<int> St;
at = 0;
for(auto &q : Srt) {
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;
}