Pagini recente » Cod sursa (job #788757) | Cod sursa (job #1433366) | Rating Mihai Zgonea (Mishulik) | Cod sursa (job #1900874) | Cod sursa (job #2894614)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
class Heap{
public:
int size=1, elemente[100001], poz_initial[100001], size_i=1, poz_heap[100001];
static int parent_index (int child_index){
return child_index/2;
}
static int left_child_index (int parent_index){
return 2*parent_index;
}
static int right_child_index (int parent_index){
return 2 * parent_index+1;
}
static bool has_parent (int index){
return parent_index(index) >= 1;
}
bool has_left_child (int index) const {
return left_child_index(index) <= size;
}
bool has_right_child (int index) const {
return right_child_index(index) <= size;
}
int val_parent (int index) {
return elemente[parent_index(index)];
}
int val_left_child (int index){
return elemente[left_child_index(index)];
}
int val_right_child (int index){
return elemente[right_child_index(index)];
}
void swap (int index1, int index2){
int temp = elemente[index1];
elemente[index1] = elemente[index2];
elemente[index2] = temp;
temp = poz_heap[elemente[index1]];
poz_heap[elemente[index1]] = poz_heap[elemente[index2]];
poz_heap[elemente[index2]] = temp;
}
void heapfyUp(){
int index = size-1;
while (has_parent(index) && val_parent(index) > elemente[index]){
swap(parent_index(index), index);
index = parent_index(index);
}
}
void heapfyDown (){
int index = 1;
while (has_left_child(index)) {
int smallerchild = left_child_index(index);
if (has_right_child(index) && val_right_child(index) < val_left_child(index))
smallerchild = right_child_index(index);
if (elemente[index] < elemente[smallerchild])
{
break;
} else{
swap(index, smallerchild);
}
index = smallerchild;
}
}
void add(int x){
elemente[size]=x;
poz_heap[elemente[size]] = size;
size++;
poz_initial[size_i]=x;
size_i++;
heapfyUp();
}
void erase (int x){
elemente[poz_heap[poz_initial[x]]] = elemente[size-1];
size--;
poz_heap[poz_initial[x]] = 0;
heapfyDown();
}
int min (){
return elemente[1];
}
};
int main() {
int nr_op, cod_op, valoare;
Heap heap;
cin>>nr_op;
for (int i=0; i<nr_op; i++){
cin>>cod_op;
if(cod_op==1){
cin>>valoare;
heap.add(valoare);
}
if(cod_op==2){
cin>>valoare;
heap.erase(valoare);
}
if(cod_op==3)
cout << heap.min()<<endl;
}
return 0;
}