Pagini recente » Arhiva de probleme | Cod sursa (job #1968380) | Cod sursa (job #3251996) | Cod sursa (job #1358371) | Cod sursa (job #3141911)
#include <iostream>
#include <vector>
#include <stack>
#include <numeric>
#include <utility>
#include <assert.h>
struct DSU {
std::vector<int> parrent;
DSU(int N) : parrent(N) {
std::iota(parrent.begin(), parrent.end(), 0);
}
int find(int x) {
return x == parrent[x] ? x : parrent[x] = find(parrent[x]);
}
void add_parrent(int x, int y) {
parrent[find(x)] = y;
}
};
int main() {
assert(freopen64("rmq.in", "r", stdin));
assert(freopen64("rmq.out", "w", stdout));
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int N, M;
std::cin >> N >> M;
std::vector<int> V(N);
for (int &x : V) {
std::cin >> x;
}
std::vector<std::vector<std::pair<int, int>>> queries(N);
for (int i = 0; i < M; i++) {
int l, r;
std::cin >> l >> r;
queries[r - 1].emplace_back(l - 1, i);
}
std::vector<int> answer(M);
DSU DS(N);
std::stack<int> S;
for (int i = 0; i < N; i++) {
while (!S.empty() && V[S.top()] > V[i]) {
DS.add_parrent(S.top(), i);
S.pop();
}
S.push(i);
for (const std::pair<int, int> &query : queries[i]) {
answer[query.second] = V[DS.find(query.first)];
}
}
for (const int &x : answer) {
std::cout << x << "\n";
}
return 0;
}