Cod sursa(job #3204742)

Utilizator marius135Dumitran Adrian Marius marius135 Data 17 februarie 2024 13:01:34
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <climits> // Added this line

using namespace std;

struct Node {
  int min_value;
  Node *left;
  Node *right;
};

Node *build_segment_tree(vector<int> &array, int start, int end) {
  if (start == end) {
    Node *node = new Node;
    node->min_value = array[start];
    node->left = nullptr;
    node->right = nullptr;
    return node;
  }

  int mid = (start + end) / 2;
  Node *left_node = build_segment_tree(array, start, mid);
  Node *right_node = build_segment_tree(array, mid + 1, end);

  Node *node = new Node;
  node->min_value = min(left_node->min_value, right_node->min_value);
  node->left = left_node;
  node->right = right_node;
  return node;
}

int query_segment_tree(Node *root, int start, int end, int x, int y) {
  if (start > end || x > y) {
    return INT_MAX;
  }

  if (start == x && end == y) {
    return root->min_value;
  }

  int mid = (start + end) / 2;
  int left_min = query_segment_tree(root->left, start, mid, x, min(y, mid));
  int right_min = query_segment_tree(root->right, mid + 1, end, max(x, mid + 1), y);

  return min(left_min, right_min);
}

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

  int n, m;
  in >> n >> m;

  vector<int> array(n);
  for (int i = 0; i < n; i++) {
    in >> array[i];
  }

  Node *root = build_segment_tree(array, 0, n - 1);

  for (int i = 0; i < m; i++) {
    int x, y;
    in >> x >> y;

    x--;
    y--;

    int min_value = query_segment_tree(root, 0, n - 1, x, y);
    out << min_value << endl;
  }

  in.close();
  out.close();

  return 0;
}