Pagini recente » Cod sursa (job #1798748) | Cod sursa (job #417543) | Cod sursa (job #1151589) | Cod sursa (job #404717) | Cod sursa (job #1501020)
#include <algorithm>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <vector>
#define pb push_back
using namespace std;
vector <int> added;
vector <pair <int, int> > minHeap;
void HeapUp(int node) {
if (!node)
return;
if (minHeap[node].first < minHeap[node / 2].first) {
swap(minHeap[node], minHeap[node / 2]);
swap(added[minHeap[node].second], added[minHeap[node / 2].second]);
HeapUp(node / 2);
}
}
void HeapDown(int node) {
int candidate = 0;
if (node * 2 + 1 < minHeap.size())
candidate = node * 2 + 1;
if (node * 2 + 2 < minHeap.size() && minHeap[node * 2 + 1].first > minHeap[node * 2 + 2].first)
candidate++;
if (candidate && minHeap[node] > minHeap[candidate]) {
swap(minHeap[node], minHeap[candidate]);
swap(added[minHeap[node].second], added[minHeap[candidate].second]);
HeapDown(candidate);
}
}
int Remove(int index) {
int numberToRemove = added[index];
swap(added[minHeap[minHeap.size() - 1].second], added[index]);
swap(minHeap[minHeap.size() - 1], minHeap[numberToRemove]);
minHeap.pop_back();
if (numberToRemove != minHeap.size()) {
HeapUp(numberToRemove);
HeapDown(numberToRemove);
}
}
int main() {
ifstream cin("heapuri.in");
freopen("heapuri.out", "w", stdout);
int operations;
for (cin >> operations; operations; operations--) {
int opType;
cin >> opType;
if (opType == 3)
printf("%d\n", minHeap[0].first);
else if (opType == 2) {
int index;
cin >> index;
Remove(index - 1);
}
else {
int number;
cin >> number;
minHeap.pb(make_pair(number, added.size()));
added.pb(minHeap.size() - 1);
HeapUp(added[added.size() - 1]);
}
}
return 0;
}