Cod sursa(job #1238095)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 5 octombrie 2014 16:59:03
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
#include <iostream>
using namespace std;

int v[1000001];
struct Node
{
  int value;
  
  int x, y;
  
  Node *left;
  Node *right;
};

Node* createTree(int lo, int hi)
{
  if (hi - lo == 0)
    {
      Node *leaf = new Node();

      leaf->value = v[hi];
      leaf->x = lo;
      leaf->y = hi;
      leaf->left  = NULL;
      leaf->right = NULL;

      return leaf;
    }

  Node* myNode = new Node();

  myNode->x = lo;
  myNode->y = hi;

  int mid = (lo + hi) >> 1;

  myNode->left  = createTree(lo, mid);
  myNode->right = createTree(mid + 1, hi);

  myNode->value = min(myNode->left->value, myNode->right->value);
  
  return myNode;
}

bool inclus (int fst1, int snd1, int fst2, int snd2)
{
  if (fst2 <= fst1 && snd1 <= snd2)
    return true;
  return false;
}

bool testOverlap(int x1, int x2, int y1, int y2) {
  return (x1 >= y1 && x1 <= y2) ||
         (x2 >= y1 && x2 <= y2) ||
         (y1 >= x1 && y1 <= x2) ||
         (y2 >= x1 && y2 <= x2);
}

bool intersectie (int fst1, int snd1, int fst2, int snd2)
{
  return testOverlap(fst1, snd1, fst2, snd2);

  if (fst2 <= snd1)
    return true;
  return false;
}

int query(Node* crt, int fst, int lst, int lo, int hi)
{
  if (inclus (fst, lst, lo, hi))
    return crt->value;

  int mid = (fst + lst) >> 1;

  int stg = 100000;
  if (intersectie (fst, mid, lo, hi))
    stg = query (crt->left, fst, mid, lo, hi);
  
  int dr = 100000;
  if (intersectie (mid + 1, lst, lo, hi))
    dr = query (crt->right, mid + 1, lst, lo, hi);

  return min(stg, dr);
}

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

  int n; cin >> n;
  int m; cin >> m;

  for (int i = 0; i < n; ++i)
    cin >> v[i];

  Node* root = createTree(0, n - 1);
  for (int i = 0; i < m; ++i)
    {
      int x, y;
      cin >> x >> y;

      --x, --y;
      
      int answer = query (root, 0, n - 1, x, y);
      cout << answer << "\n"; 
    }

  return 0;
}