Cod sursa(job #2882494)

Utilizator AndreiV03Andrei Voicu AndreiV03 Data 31 martie 2022 14:56:54
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
using namespace std;

#define NMAX 100001

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

int n, m;
int tree[4 * NMAX];

void init(int node, int left, int right, int pos, int val) {
  if (left == right) {
    tree[node] = val;
    return;
  }
  
  int mid = (left + right) / 2;
  if (pos <= mid)
    init(2 * node, left, mid, pos, val);
  else init(2 * node + 1, mid + 1, right, pos, val);
  
  tree[node] = min(tree[2 * node], tree[2 * node + 1]);
}

int query(int node, int left, int right, int start, int finish) {
  if (left > finish || right < start)
    return 0x3f3f3f3f;
  
  if (start <= left && right <= finish)
    return tree[node];
  
  int mid = (left + right) / 2;
  int ql = query(2 * node, left, mid, start, finish);
  int qr = query(2 * node + 1, mid + 1, right, start, finish);
  
  return min(ql, qr);
}

int main() {
  cin >> n >> m;
  for (int i = 1, x; i <= n; ++i) {
    cin >> x;
    init(1, 1, n, i, x);
  }
  
  for (int i = 1, a, b; i <= m; ++i) {
    cin >> a >> b;
    cout << query(1, 1, n, a, b) << "\n";
  }
  
  cin.close();
  cout.close();
  return 0;
}