Cod sursa(job #1990421)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 11 iunie 2017 19:50:11
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>

const int MAXN = 2e5;

int v[MAXN], heap[MAXN], poz[MAXN], n;

inline int leftson(int n) {
  return 2 * n + 1;
}

inline int rightson(int n) {
  return 2 * n + 2;
}

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

inline void swap(int a, int b) {
  int aux;
  poz[heap[a]] = b;
  poz[heap[b]] = a;
  aux = heap[a];
  heap[a] = heap[b];
  heap[b] = aux;
}

inline void up(int p) {
  while ((p) && (v[heap[p]] < v[heap[father(p)]])) {
    swap(p, father(p));
    p = father(p);
  }
}

inline void down(int p) {
  int x;
  bool r;
  r = 0;
  while ((!r) && (leftson(p) < n)) {
    x = leftson(p);
    if ((rightson(p) < n) && (v[heap[rightson(p)]] < v[heap[x]])) {
      x = rightson(p);
    }
    if (v[heap[x]] < v[heap[p]]) {
      swap(p, x);
      p = x;
    } else {
      r = 1;
    }
  }
}

inline void erase(int p) {
  --n;
  heap[poz[p]] = heap[n];
  poz[heap[n]] = poz[p];
  if ((v[heap[poz[p]]] < v[heap[father(poz[p])]]) && (poz[p])) {
    up(poz[p]);
  } else {
    down(poz[p]);
  }
}

inline void insert(int p) {
  heap[n] = p;
  poz[p] = n;
  ++n;
  up(poz[p]);
}

int main() {
  FILE *fin, *fout;
  int t, x, op, p;
  fin = fopen("heapuri.in", "r");
  fscanf(fin, "%d", &t);
  fout = fopen("heapuri.out", "w");
  p = n = 0;
  for (int i = 0; i < t; ++i) {
    fscanf(fin, "%d", &op);
    switch (op) {
      case 1:
        fscanf(fin, "%d", &x);
        v[p] = x;
        insert(p);
        ++p;
        break;
      case 2:
        fscanf(fin, "%d", &x);
        erase(x - 1);
        break;
      case 3:
        fprintf(fout, "%d\n", v[heap[0]]);
        break;
    }
  }
  fclose(fin);
  fclose(fout);
  return 0;
}