Cod sursa(job #1386669)

Utilizator c0rn1Goran Cornel c0rn1 Data 13 martie 2015 10:15:46
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <algorithm>
#include <cstdio>
#define inf 0x3f3f3f3f

using namespace std;

int n, m;

struct interval { int st, mid, dr; };
struct node
{
   interval interv;
   int mini;
   node *st, *dr;
   node(){}
   node(int stanga, int dreapta)
   {
      interv.st = stanga;
      interv.dr = dreapta;
      mini = inf;
      if (interv.st != interv.dr){
         interv.mid = (interv.st + interv.dr) / 2;
         this->st = new node(interv.st, interv.mid);
         this->dr = new node(interv.mid + 1, interv.dr);
      }
      else {
         this->st = new node();
         this->dr = new node();
      }
   }
};
node *start;

int pos, val;
void update(node *x)
{
   if (x->interv.st == x->interv.dr){
      x->mini = val;
      return;
   }
   if (pos <= x->interv.mid)
      update(x->st);
   else
      update(x->dr);

   x->mini = min(x->st->mini, x->dr->mini);
}

int minim;
interval intervalCitit;
void querry(node *x)
{
   if (intervalCitit.st <= x->interv.st && x->interv.dr <= intervalCitit.dr){
      minim = min(minim, x->mini);
      return;
   }
   if (intervalCitit.st <= x->interv.mid)
      querry(x->st);
   if (x->interv.mid < intervalCitit.dr)
      querry(x->dr);
}

int main()
{
   freopen("rmq.in", "r", stdin);
   freopen("rmq.out", "w", stdout);
   int x, k, a, b;
   scanf("%d %d\n", &n, &m);
   start = new node(1, n);
   for (int i = 1; i <= n; ++i){
      scanf("%d ", &x);
      pos = i;
      val = x;
      update(start);
   }
   for (int i = 1; i <= m; ++i){
      scanf("%d %d\n", &a, &b);
      /// querry
      minim = inf;
      intervalCitit.st = a;
      intervalCitit.dr = b;
      querry(start);
      printf("%d\n", minim);
   }

   return 0;
}