Cod sursa(job #2474101)

Utilizator daru06Daria Culac daru06 Data 14 octombrie 2019 18:48:10
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>

#define NMAX 100001
#define LMAX 17
// 2^17 = 131072

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, i, a[NMAX], m[LMAX][NMAX], s, d, q, lu, lg[NMAX], l;

void dina() {
  int l, c;

  for (c = 1; c <= n; c++) // Minimele pentru secventele de lungime 1 = 2^0.
    m[0][c] = a[c];
  // Minimele pentru secvente de lungime 2^l.
    for(l=1; (lu = (1 << l)) <= n; l++)
        for(c=1; c + (lu - 1) <= n; c++) // c + ? <= n // Capatul drept sa fie in sir.
    {
        m[l][c]=min(m[l-1][c], m[l-1][c + (lu >> 1)]);
    }
}

int main()
{
  fin >> n >> q;
  for (i = 1; i <= n; i++)
    fin >> a[i];
  dina ();
  lg[1] = 0;
  for (i = 2; i <= n; i++) // [log2 i]
    lg[i]=lg[i >> 1] + 1;
  for (i = 1; i <= q; i++) {
    fin >> s >> d;
    lu = d - s + 1;
    l = lg[lu]; // linia din care luam informatiile
    fout << min(m[l][s], m[l][d - (1<<l) + 1]) << '\n';
  }
  return 0;
}

/// 101 ... 164 -> k = 5
/// 101 ... 150 -> k = 5
/// 101 ... 132 -> k = 4