Pagini recente » Cod sursa (job #1299889) | Cod sursa (job #486411) | Cod sursa (job #1546325) | Cod sursa (job #583300) | Cod sursa (job #2895663)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int size = 0, heap[100001], initial[100001], size_i = 0, pozitie[100001];
int parent_index (int child_index){
return child_index/2;
}
int left_child_index (int parent_index){
return 2*parent_index;
}
int right_child_index (int parent_index){
return 2 * parent_index+1;
}
bool has_parent (int index){
return parent_index(index) >= 1;
}
bool has_left_child (int index){
return left_child_index(index) <= size;
}
bool has_right_child (int index){
return right_child_index(index) <= size;
}
int val_parent (int index) {
return heap[parent_index(index)];
}
int val_left_child (int index){
return heap[left_child_index(index)];
}
int val_right_child (int index){
return heap[right_child_index(index)];
}
void swap (int index1, int index2){
int temp = heap[index1];
heap[index1] = heap[index2];
heap[index2] = temp;
temp = pozitie[heap[index1]];
pozitie[heap[index1]] = pozitie[heap[index2]];
pozitie[heap[index2]] = temp;
}
void heapfyUp(){
int index = size;
while (has_parent(index) && val_parent(index) > heap[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 (heap[index] < heap[smallerchild])
{
break;
} else{
swap(index, smallerchild);
}
index = smallerchild;
}
}
void add(int x){
size++;
heap[size]=x;
pozitie[x] = size;
size_i++;
initial[size_i]=x;
heapfyUp();
}
void erase (int x){
heap[pozitie[initial[x]]] = heap [size];
size--;
pozitie[initial[x]] = 0;
heapfyDown();
}
int min (){
return heap[1];
}
int main (){
int nr_op, cod_op, valoare;
fin >> nr_op;
for (int i=0; i<nr_op; i++){
fin>>cod_op;
if(cod_op==1){
fin>>valoare;
add(valoare);
}
if(cod_op==2){
fin>>valoare;
erase(valoare);
}
if(cod_op==3)
fout << min()<<endl;
}
return 0;
}