Cod sursa(job #2882319)

Utilizator AndreiV03Andrei Voicu AndreiV03 Data 31 martie 2022 12:14:08
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 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]);
}

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

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;
    int minimum = 0x3f3f3f;
    query(1, 1, n, a, b, minimum);
    cout << minimum << "\n";
  }
  
  cin.close();
  cout.close();
  return 0;
}