Pagini recente » Cod sursa (job #1239038) | Cod sursa (job #391324) | Cod sursa (job #2836034) | Cod sursa (job #1915216) | Cod sursa (job #2403890)
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class MinHeap {
private:
void heapify(unsigned int root);
vector<int> insertHistory;
vector<int> H;
public:
void insert(int value);
void remove(unsigned int insertIndex);
int getMinim() {
return (H.size() > 0) ? H[0] : numeric_limits<int>::min();
}
void print();
};
void MinHeap::heapify(unsigned int root) {
unsigned int minimum = root;
unsigned int left = 2 * root + 1;
unsigned int right = 2 * root + 2;
if (left < H.size() && H[left] < H[minimum])
minimum = left;
if (right < H.size() && H[right] < H[minimum])
minimum = right;
if (minimum != root) {
swap(H[minimum], H[root]);
heapify(minimum);
}
}
void MinHeap::insert(int value) {
insertHistory.push_back(value);
H.push_back(value);
if (H.size() >= 1) {
swap(H[0], H[ H.size() - 1 ]);
heapify(0);
}
}
void MinHeap::remove(unsigned int insertIndex) {
int value = insertHistory[insertIndex - 1];
unsigned int pos = -1;
for (unsigned int i = 0; i < H.size(); ++i) {
if (H[i] == value) {
pos = i;
break;
}
}
swap(H[pos], H[ H.size() - 1 ]);
H.pop_back();
heapify(pos);
}
void MinHeap::print() {
for (vector<int>::iterator it = H.begin(); it != H.end(); ++it) {
cout << *it << " ";
}
cout << "\n";
}
int main() {
MinHeap * H = new MinHeap();
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
unsigned int Q, task, value;
fin >> Q;
for (unsigned int i = 0; i < Q; ++i) {
fin >> task;
switch (task) {
case 1: // insert
fin >> value;
H->insert(value);
break;
case 2: // remove
fin >> value;
H->remove(value);
break;
case 3: // get min
default:
fout << H->getMinim() << "\n";
break;
}
}
fin.close();
fout.close();
delete H;
return 0;
}