Cod sursa(job #2587348)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 22 martie 2020 17:45:17
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

class Heap{
public:
  Heap()
  {
    data_.emplace_back(0,0);
    timeToIndex_.emplace_back(0);
  }

  void Insert(int val)
  {
    data_.emplace_back(val, (int)timeToIndex_.size());
    int pos = (int)data_.size() - 1;
    timeToIndex_.emplace_back(pos);
    pushUp(pos);    
  }

  int Top()
  {
    return data_[1].val;
  }

  void Delete(int time)
  {
    int pos = timeToIndex_[time];
    int last = data_.size() - 1;
    
    data_[pos] = data_[last];
    timeToIndex_[data_[pos].time] = pos;
    data_.pop_back();
    pushDown(pos);
  }

private:
  void pushUp(int k)
  {
    int val = data_[k].val;
    int time = data_[k].time;
    
    while (true) {
      int dad = (k >> 1);

      if (dad == 0 || data_[dad].val <= val)
	break;

      data_[k] = data_[dad];
      timeToIndex_[data_[k].time] = k;
      k = dad;
    }

    data_[k] = {val, time};
    timeToIndex_[time] = k;
  }

  void pushDown(int k)
  {
    int val = data_[k].val;
    int time = data_[k].time;

    while (true) {
      int left = (k << 1);
      int right = ((k << 1) | 1);

      if (left >= data_.size())
	break;

      int choice;
      if (right >= data_.size())
	choice = left;
      else {
	if (data_[left].val < data_[right].val)
	  choice = left;
	else
	  choice = right;
      }
      if (val <= data_[choice].val)
	break;
      
      data_[k] = data_[choice];
      timeToIndex_[data_[k].time] = k;
      k = choice;
    }

    data_[k] = {val, time};
    timeToIndex_[time] = k;
  }
  
  class Stamp {
   public:
    Stamp(int x, int y): val(x), time(y){}
    int val;
    int time;
  };
  vector<Stamp> data_;
  vector<int> timeToIndex_;
};

int main()
{
  freopen("heapuri.in", "r", stdin);
  freopen("heapuri.out", "w", stdout);

  int N;
  scanf("%d", &N);
  Heap heap;
  
  for (int i = 0; i < N; ++i) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      int x;
      scanf("%d", &x);
      heap.Insert(x);
    }
    else if (op == 2) {
      int x;
      scanf("%d", &x);
      heap.Delete(x);
    }
    else printf("%d\n", heap.Top());
  }
  
  return 0;
}