Pagini recente » Cod sursa (job #2137211) | Istoria paginii runda/jkn/clasament | Cod sursa (job #1466894) | Istoria paginii runda/ivegotabrothernamedlee | Cod sursa (job #1823954)
#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;
};
void Read(int &a) {
static char c;
for(c = getchar(); !isdigit(c); c = getchar());
for(a = 0; isdigit(c); c = getchar())
a = (a << 1) + (a << 3) + c - '0';
}
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)
Read(v);
vector<Query> Qs(m);
int at = 0;
for(auto &p : Qs) {
Read(p.a); Read(p.b);
p.a--;
p.i = at++;
}
Link.resize(n, -1);
sort(Qs.begin(), Qs.end(), [](const Query &a, const Query &b) {
return a.b < b.b;
});
vector<int> St;
at = 0;
for(const 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(const auto &a : Ans)
cout << a << '\n';
return 0;
}