Pagini recente » Cod sursa (job #2949534) | Cod sursa (job #224155) | Cod sursa (job #1809540) | Cod sursa (job #2667787) | Cod sursa (job #2587348)
#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;
}