Cod sursa(job #2212946)

Utilizator PetyAlexandru Peticaru Pety Data 15 iunie 2018 13:28:56
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");

int n, m, v[200002], tip, x, t;
struct Heap{
  int val, ord;
} h[200002];

void percolate (int k) {
  Heap aux = h[k];
  while (k > 1 && aux.val < h[k / 2].val) {
    h[k] = h[k / 2];
    v[h[k].ord] = k;
    k = k / 2;
  }
  h[k] = aux;
  v[h[k].ord] = k;
}

void baga_acolo (int x) {
  h[++n].val = x;
  h[n].ord = ++m;
  v[m] = n;
  percolate(n);
}

void sift (int k) {
  int fiu = 0;
  do {
    fiu = 0;
    if (2 * k <= n) {
      fiu = 2 * k;
      if (2 * k + 1 <= n && h[2 * k + 1].val < h[2 * k].val)
        fiu = 2 * k + 1;
      if (h[fiu].val >= h[k].val)
        fiu = 0;
    }
    if (fiu) {
      v[h[k].ord] = fiu;
      v[h[fiu].ord] = k;
      swap(h[k], h[fiu]);
      k = fiu;
    }
  }while (fiu);
}

void scoate (int k){
  h[k] = h[n];
  v[h[k].ord] = k;
  n--;
  if (k > 1 && h[k].val < h[k / 2].val)
    percolate(k);

  else
    sift(k);
}

int main()
{
  fin >> t;
  for (int i = 1; i <= t; i++) {
    fin >> tip;
    if (tip == 1) {
      fin >> x;
      baga_acolo(x);
    }
    else if (tip == 2) {
      fin >> x;
      scoate(v[x]);
    }
    else
      fout << h[1].val << "\n";
  }
  return 0;
}