Pagini recente » Cod sursa (job #2323750) | Cod sursa (job #25301) | Cod sursa (job #2793901) | Cod sursa (job #1956608) | Cod sursa (job #1500993)
#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) {
swap(added[minHeap[minHeap.size() - 1].second], added[index]);
swap(minHeap[minHeap.size() - 1], minHeap[added[minHeap[minHeap.size() - 1].second]]);
minHeap.pop_back();
if (added[index] != minHeap.size()) {
HeapUp(added[index]);
HeapDown(added[index]);
}
}
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;
}