Cod sursa(job #3141911)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 17 iulie 2023 17:10:41
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#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;
}