Cod sursa(job #1264743)

Utilizator juniorOvidiu Rosca junior Data 16 noiembrie 2014 08:41:56
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
// Se da un vector si doi indici
// Sa se determine pozitia elementului minim situat intre cei doi indici.
// Rezolvare cu arbore de intervale, 70 p [infoarena]

#include <fstream>

using namespace std;

ifstream fi("rmq.in");
ofstream fo("rmq.out");
int n, i, a[100001], m[1500][1500], s, d, q;

void dina () {
  int l, c;

  for (l = 1; l <= n; l++)
    m[l][l] = l;
  for (l = 1; l <= n; l++)
    for (c = l + 1; c <= n; c++)
      if (a[m[l][c - 1]] < a[c])
        m[l][c] = m[l][c - 1];
      else
        m[l][c] = c;
}

int main() {
  fi >> n >> q;
  for (i = 1; i <= n; i++)
    fi >> a[i];
  dina ();
  for (i = 1; i <= q; i++) {
    fi >> s >> d;
    fo << a[m[s][d]] << '\n';
  }
  return 0;
}

/*
Cazurile posibile in cerere:
( ) [   ]       caz 1
s d b   e

 (  [ ) ]       caz 3
 s  b d e

 (  [   ] )     caz 2
 s  b   e d

    [ ()]       caz 3
    b sde

    [ ( ] )     caz 3
    b s e d

    [   ] ()    caz 1
    b   e sd
*/