Cod sursa(job #2291020)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 27 noiembrie 2018 12:44:47
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.55 kb
#include <cstdio>
#include <algorithm>
#include <unordered_map>

const int MAX_N = 100000;

int heap[1 + MAX_N];
int size;
int added[1 + MAX_N];
std::unordered_map<int, int> pos;

void up_rebuild(int node) {
  while (node / 2 >= 1 && heap[node] > heap[node / 2]) {
    std::swap(pos[heap[node]], pos[heap[node / 2]]);
    std::swap(heap[node], heap[node / 2]);
    if (node != 1 && heap[node / 2 * 2] < heap[node / 2 * 2 + 1]) {
      std::swap(pos[heap[node / 2 * 2]], pos[heap[node / 2 * 2 + 1]]);
      std::swap(heap[node / 2 * 2], heap[node / 2 * 2 + 1]);
    }
    node /= 2;
  }
  if (node != 1 && node / 2 * 2 + 1 <= size  && heap[node / 2 * 2] < heap[node / 2 * 2 + 1]) {
    std::swap(pos[heap[node / 2 * 2]], pos[heap[node / 2 * 2 + 1]]);
    std::swap(heap[node / 2 * 2], heap[node / 2 * 2 + 1]);
  }
}

void down_rebuild(int node) {
  while (2 * node + 1 <= size && heap[node] < heap[2 * node + 1]) {
    std::swap(pos[heap[node]], pos[heap[2 * node + 1]]);
    std::swap(heap[node], heap[2 * node + 1]);
    if (node != 1 && heap[node / 2 * 2] < heap[node / 2 * 2 + 1]) {
      std::swap(pos[heap[node / 2 * 2]], pos[heap[node / 2 * 2 + 1]]);
      std::swap(heap[node / 2 * 2], heap[node / 2 * 2 + 1]);
    }
    node = 2 * node + 1;
  }
  while (2 * node <= size && heap[node] < heap[2 * node]) {
    std::swap(pos[heap[node]], pos[heap[2 * node]]);
    std::swap(heap[node], heap[2 * node]);
    if (node != 1 && node / 2 * 2 + 1 <= size && heap[node / 2 * 2] < heap[node / 2 * 2 + 1]) {
      std::swap(pos[heap[node / 2 * 2]], pos[heap[node / 2 * 2 + 1]]);
      std::swap(heap[node / 2 * 2], heap[node / 2 * 2 + 1]);
    }
    node = 2 * node;
  }
  if (node != 1 && node / 2 * 2 + 1 <= size && heap[node / 2 * 2] < heap[node / 2 * 2 + 1]) {
    std::swap(pos[heap[node / 2 * 2]], pos[heap[node / 2 * 2 + 1]]);
    std::swap(heap[node / 2 * 2], heap[node / 2 * 2 + 1]);
  }
}

void addValue(int x) {
  heap[++size] = x;
  pos[x] = size;
  up_rebuild(size);
}

void deleteValue(int x) {
  int last_leaf = heap[size];
  std::swap(heap[pos[x]], heap[size]);
  std::swap(pos[x], pos[last_leaf]);
  size--;
  down_rebuild(pos[last_leaf]);
}

int main() {
  freopen("heapuri.in", "r", stdin);
  freopen("heapuri.out", "w", stdout);
  
  int n;
  scanf("%d", &n);
  int k = 0;
  for (int i = 1; i <= n; i++) {
    int type, x;
    scanf("%d", &type);
    if (type == 1) {
      scanf("%d", &x);
      added[++k] = x;
      addValue(x);
    } else if (type == 2) {
      scanf("%d", &x);
      x = added[x];
      deleteValue(x);
    } else {
      printf("%d\n", heap[size]);
    }
  }
  return 0;
}