Cod sursa(job #2643106)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 18 august 2020 18:34:10
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 kb
#include <fstream>
#include <climits>

using namespace std;

const int NMAX = 200000;

int l_heap;
int heap[1 + NMAX];

int nr;
int vec[1 + NMAX];
int poz[1 + NMAX];

void schimb(int poz_a, int poz_b)
{
  swap(poz[heap[poz_a]], poz[heap[poz_b]]);
  swap(heap[poz_a], heap[poz_b]);
}

void bubble_up(int poz_heap)
{
  int poz_parinte = poz_heap / 2;
  while (poz_parinte != 0 && vec[heap[poz_parinte]] > vec[heap[poz_heap]])
  {
    schimb(poz_parinte, poz_heap);
    poz_heap    = poz_parinte;
    poz_parinte = poz_heap / 2;
  }
}

void bubble_down(int poz_heap)
{
  int poz_fiu_1 = 2 * poz_heap;
  int poz_fiu_2 = 2 * poz_heap + 1;

  while ((poz_fiu_1 <= l_heap && vec[heap[poz_fiu_1]] < vec[heap[poz_heap]]) ||
         (poz_fiu_2 <= l_heap && vec[heap[poz_fiu_2]] < vec[heap[poz_heap]]))
  {
    if (vec[heap[poz_fiu_1]] < vec[heap[poz_fiu_2]])
    {
      schimb(poz_fiu_1, poz_heap);
      poz_heap = poz_fiu_1;
    }
    else
    {
      schimb(poz_fiu_2, poz_heap);
      poz_heap = poz_fiu_2;
    }

    poz_fiu_1 = 2 * poz_heap;
    poz_fiu_2 = 2 * poz_heap + 1;
  }
}

void adaugare(int element)
{
  nr++;
  vec[nr] = element;

  l_heap++;
  heap[l_heap] = nr;
  poz[nr] = l_heap;

  bubble_up(l_heap);
}

void eliminare(int index)
{
  int last = heap[l_heap];
  schimb(poz[index], l_heap);

  vec[index] = INT_MAX;
  l_heap--;

  bubble_up(poz[last]);
  bubble_down(poz[last]);
}

int main()
{
  ifstream in("heapuri.in");
  ofstream out("heapuri.out");

  int n, op, element, index;

  in >> n;
  for (int i = 1; i <= n; i++)
  {
    in >> op;
    switch (op)
    {
      case 1:
      {
         in >> element;
         adaugare(element);
         break;
      }
      case 2:
      {
         in >> index;
         eliminare(index);
         break;
      }
      case 3:
      {
         out << vec[heap[1]] << '\n';
         break;
      }
    }

    /*
    for (int j = 1; j <= nr; j++)
        out << vec[j]<<' ';
    out << '\n';
    for (int j = 1; j <= nr; j++)
        out << poz[j]<<' ';
    out << '\n';
    for (int j = 1; j <= l_heap; j++)
        out << heap[j]<<' ';
    out << '\n';
    out << '\n';
    */
  }

  return 0;
}