Pagini recente » Cod sursa (job #938676) | Cod sursa (job #894846) | Cod sursa (job #2855620) | Cod sursa (job #217668) | Cod sursa (job #3294337)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("mergeheap.in");
ofstream fout("mergeheap.out");
class Node {
public:
int value;
Node* parent;
vector<Node*> children;
int degree;
Node(int value) {
this->value = value;
parent = nullptr;
degree = 0;
children.clear();
}
};
class BinomialHeap {
public:
vector<Node*> trees;
Node* min_node;
int total;
BinomialHeap() {
min_node = nullptr;
total = 0;
trees.clear();
}
bool isEmpty() {
return min_node == nullptr;
}
void find_min() {
min_node = nullptr;
for (Node* tree : trees)
if (min_node == nullptr || tree->value < min_node->value)
min_node = tree;
}
void merge(BinomialHeap& other_heap) {
trees.insert(trees.end(), other_heap.trees.begin(), other_heap.trees.end());
total += other_heap.total;
find_min();
}
void insert(int x) {
Node* nod = new Node(x);
BinomialHeap heap;
heap.trees.push_back(nod);
merge(heap);
}
int extract_min() {
Node* minNode = min_node;
for (auto it = trees.begin(); it != trees.end(); it++)
if (*it == minNode) {
trees.erase(it);
break;
}
BinomialHeap heap;
heap.trees = minNode->children;
merge(heap);
find_min();
total--;
return minNode->value;
}
};
int main() {
int n, q, op, x, a, b;
vector<BinomialHeap> v;
fin >> n >> q;
for (int i = 0; i < n; i++)
v.push_back(BinomialHeap());
while (q--) {
fin >> op;
if (op == 1) {
fin >> a >> x;
v[a - 1].insert(-x);
}
else
if (op == 2) {
fin >> a;
fout << -v[a - 1].extract_min() << "\n";
}
else {
fin >> a >> b;
v[a - 1].merge(v[b - 1]);
}
}
return 0;
}