Cod sursa(job #3133017)

Utilizator HefaSteopoaie Vlad Hefa Data 24 mai 2023 20:22:36
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.13 kb
#include <iostream>
#include <vector>
#include <fstream>

std::ofstream fout("rmq.out");
std::ifstream fin("rmq.in");

using namespace std;

// RMQ

int RMQ(int i, int j, int **M, int* v)
{
  if (i > j)
    return 0x3f3f3f3f;

  if (i == j)
    return M[i][0];

  if (i + 1 == j)
    return M[i][1];

  int p, log2;
  for (log2 = 1, p = 2; p + i <= j; p *= 2, log2++)
    ;
  log2--;
  p /= 2;

  int min = RMQ(i + p, j, M, v);
  return v[min] < v[M[i][log2]] ? (min) : (M[i][log2]);
}

void Preprocesare(int **M, int *v, int n)
{
  for (int i = 0; i < n; i++)
    M[i][0] = i;
  
  for (int j = 1; 1 << j <= n; j++)
  {
    for (int i = 0; i + (1 << j) - 1 < n; i++)
    {
      if (v[M[i][j - 1]] <= v[M[i + (1 << j - 1)][j - 1]])
        M[i][j] = M[i][j - 1];
      else
        M[i][j] = M[i + (1 << j - 1)][j - 1];
    }
  }
}

int main()
{
  int n, m, *v;
  fin >> n >> m;
  v = new int[n];
  int log2, p;

  for (log2 = 1, p = 2; p <= n; log2++, p *= 2)
    ;

  int **M = new int *[n];
  for (int i = 0; i <= n; i++)
    M[i] = new int[log2];

  for (int i = 0; i < n; i++)
  {
    fin >> v[i];
  }
  
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < log2; j++)
      M[i][j] = 0x3f3f3f3f;
  }
  Preprocesare(M, v, n);

  for (int i = 0; i < m; i++)
  {
    int p, q;
    fin >> p >> q;
    p--, q--;
    // raspuns
    fout << v[RMQ(p, q, M, v)] << endl;
  }

  for (int i = 0; i < n; i++)
  {
    delete[] M[i];
  }
  delete[] M;
  delete[] v;
  return 0;
}

// Heapuri

// int father(int k)
// {
//   return (k - 1) / 2;
// }

// int left_son(int k) {
//   return 2 * k + 1;
// }

// int right_son (int k)
// {
//   return 2 * k + 2;
// }

// void Percolate(vector<int> &h, vector<int> &o)
// {
//   int k = h.size() - 1;

//   while (k > 0 && h[k] < h[father(k)])
//   {
//     swap(h[k], h[father(k)]);
//     swap(o[k], o[father(k)]);
//     k = father(k);
//   }
// }

// void Sift(vector<int> &h, vector<int> &o, int k)
// {
//   int son;
//   int size = h.size();
//   do {
//     son = 0;
//     if (left_son(k) < size){
//         son = left_son(k);
//       if(right_son(k) < size && h[son] > h[right_son(k)])
//         son = right_son(k);
//       if (h[son] >= h[k])
//         son = 0;
//     }

//     if(son){
//       swap(h[son], h[k]);
//       swap(o[son], o[k]);
//       k = son;
//     }
//   } while(son);
// }

// void Insereaza(vector<int> &h, vector<int> &o, int val, int ord)
// {
//   h.push_back(val);
//   o.push_back(ord);
//   Percolate(h, o);
// }

// void AfiseazaVal(vector<int> h)
// {
//   fout << h[0] << endl;
// }

// void Elimina(vector<int>& h, vector<int> o, int poz)
// {
//   swap(h[poz], h[h.size() - 1]);
//   swap(o[poz], o[o.size() - 1]);
//   h.pop_back();
//   o.pop_back();
//   if (poz > 0 && h[poz] < h[father(poz)]){
//     swap(h[poz], h[h.size() - 1]);
//     swap(o[poz], o[o.size() - 1]);
//     Percolate(h, o);
//   }
//   else
//     Sift(h, o, poz);
// }

// int main()
// {
//   vector<int> heap;
//   vector<int> ordine;
//   // Insereaza(heap, 3);
//   // Insereaza(heap, 5);
//   // Insereaza(heap, 4);
//   // Insereaza(heap, 1);
//   // Insereaza(heap, 10);
//   // Insereaza(heap, 9);
//   // Insereaza(heap, 4);
//   // Insereaza(heap, 2);
//   // for (int i = 0; i < heap.size(); i ++)
//   //   cout << heap[i] << " ";
//   int n;
//   fin >> n;
//   int cnt = 1;
//   for (int i = 1; i <= n; i++)
//   {

//     int comanda;
//     fin >> comanda;
//     switch (comanda)
//     {
//     case 1:
//     {
//       int valoare;
//       fin >> valoare;
//       Insereaza(heap, ordine, valoare, cnt++);
//       break;
//     }
//     case 2:
//     {
//       int valoare;
//       fin >> valoare;
//       int j;
//       for (j = 0; j < ordine.size(); j ++)
//         if (ordine[j] == valoare)
//         {
//           break;
//         }
//       Elimina(heap, ordine, j);
//       break;
//     }
//     case 3:
//     {
//       AfiseazaVal(heap);
//       break;
//     }
//     }
//   }
//   return 0;
// }