Cod sursa(job #2354169)

Utilizator lflorin29Florin Laiu lflorin29 Data 24 februarie 2019 22:43:56
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.76 kb
#include <bits/stdc++.h>

using namespace std;

int main() {
  ifstream cin("rmq.in");
  ofstream cout("rmq.out");

  int n, q;
  cin >> n >> q;
  vector<int>arr(n);
  for(int i = 0; i < n; ++ i)
    cin >> arr[i];
  vector < vector<pair<int, int>>> qs(n);
  for(int i = 0; i < q; ++ i) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    qs[b].emplace_back(a, i);
  }
  vector<int>answer(q);
  stack<int>stk;
  set<int>mins;
  for(int i = 0; i < n; ++ i) {
    while(!stk.empty() && arr[stk.top()] >= arr[i]) {
      mins.erase(stk.top());
      stk.pop();
    }
    stk.push(i);
    mins.insert(i);
    for(auto it : qs[i]) {
       answer[it.second] = arr[*(mins.lower_bound(it.first))];
    }
  }
  for(int i = 0; i < q; ++ i)
    cout << answer[i] << '\n';
  return 0;
}