Pagini recente » Cod sursa (job #3362366) | Cod sursa (job #3362394) | Atasamentele paginii Profil crismarina | Cod sursa (job #3363484) | Cod sursa (job #3362313)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct Node {
int value;
int index;
};
class Heap {
vector<Node> v;
vector<int> entered;
int count = 0;
void swap_nodes(int a, int b) {
swap(v[a], v[b]);
entered[v[a].index] = a;
entered[v[b].index] = b;
}
int get_min_child(int i) {
if (2*i + 1 >= v.size()) {
if (2*i < v.size()) {
return 2*i;
}
return -1;
}
if (v[2*i + 1].value > v[2*i].value) {
return 2*i;
}
return 2*i + 1;
}
public:
Heap() {
v.push_back({-1, -1});
}
void insert(int value) {
v.push_back({value, count++});
entered.push_back(v.size() - 1);
int i = v.size() - 1;
while (i > 1 && v[i/2].value > v[i].value) {
swap_nodes(i, i/2);
i /= 2;
}
}
int get_minimum() {
return v[1].value;
}
void erase(int x) {
int i = entered[x];
swap_nodes(i, v.size() - 1);
entered[v.back().index] = -1;
v.pop_back();
if (i == v.size()) {
return;
}
while (i > 1 && v[i/2].value > v[i].value) {
swap_nodes(i, i/2);
i /= 2;
}
int child;
while ((child = get_min_child(i)) != -1 && v[i].value > v[child].value) {
swap_nodes(i, child);
i = child;
}
}
};
int main() {
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
Heap heap;
int Q;
fin >> Q;
for (int q = 0; q < Q; ++q) {
int opcode;
fin >> opcode;
switch (opcode) {
int x;
case 1:
fin >> x;
heap.insert(x);
break;
case 2:
fin >> x;
heap.erase(x-1);
break;
case 3:
fout << heap.get_minimum() << '\n';
break;
}
}
return 0;
}