Cod sursa(job #2500889)

Utilizator vlad.proteasaVlad Proteasa vlad.proteasa Data 28 noiembrie 2019 20:03:41
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <bits/stdc++.h>
using namespace std;

const int maxn = 100001 , maxm = 1000000;
int par[maxn], ans[maxm], n, a[maxn], l[maxm], q;
vector<int> qu[maxn];
int root(int v) { return par[v] == -1 ? v : par[v] = root(par[v]); }
int main(int argc, const char* argv[]) {
  cout << maxn;
  ifstream in;
  ofstream out;
  in.open("rmq.in");
  out.open("rmq.out");
  memset(par, -1, sizeof par);
  in >> n;
  in >> q;
  for (int i = 0; i < n; i++)
    in >> a[i];

  for (int i = 0, r; i < q; i++) {
    in >> l[i] >> r;
    l[i]--;
    r--;
    qu[r].push_back(i);
  }
  stack<int> st;
  for (int i = 0; i < n; i++) {
    while (st.size() && a[st.top()] > a[i]) par[st.top()] = i, st.pop();
    st.push(i);
    for (auto qi : qu[i]) ans[qi] = a[root(l[qi])];
  }
  for (int i = 0; i < q; i++) out << ans[i] << '\n';
  return 0;
}