Cod sursa(job #2500226)

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

const int maxn = 1e5 + 17;
int par[maxn], ans[maxn], n, a[maxn], l[maxn], q;
vector<int> qu[maxn];

int root(int v){
    return par[v] == -1 ? v : par[v] = root(par[v]);
}

int main(){
  ifstream in;
  ofstream out;
  in.open("rmq.in");
  out.open("rmq.out");
    memset(par, -1, sizeof par);
    in >> n >> q;
    for(int i = 0; i < n; i++)
      in >> a[i];
    for(int i = 0, r; i < q; i++){
	       in >> 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;
}