Pagini recente » Cod sursa (job #2942040) | Cod sursa (job #2621885) | Cod sursa (job #293214) | Cod sursa (job #232833) | Cod sursa (job #2564376)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
struct Numbers{
int val;
int position;
Numbers(){
val = -1;
position = -1;
}
};
vector <Numbers> min_heap (300000);
vector <int> positions (300000);
int n, i, current_state = 1, j, aux1, aux2, aux3;
Numbers curr_read_number;
int query, position_of_the_read_number = 1;
void add_numbers(Numbers number){
min_heap[current_state] = number;
positions[number.position] = current_state;
for (j=current_state ; j>1; j=aux1){
aux1 = j/2;
if (min_heap[j].val < min_heap[aux1].val) {
swap(min_heap[j] , min_heap[aux1]);
positions[min_heap[j].position] = j;
positions[min_heap[aux1].position] = aux1;
}
}
current_state++;
}
void remove_numbers(int position_of_number_to_be_removed){
current_state--;
min_heap[position_of_number_to_be_removed] = min_heap[current_state];
min_heap[current_state].val = -1;
min_heap[current_state].position = -1;
if (current_state != position_of_number_to_be_removed) {
if (min_heap[position_of_number_to_be_removed].val < min_heap[position_of_number_to_be_removed/2].val && position_of_number_to_be_removed > 1){
swap(min_heap[position_of_number_to_be_removed] , min_heap[position_of_number_to_be_removed/2]);
positions[min_heap[position_of_number_to_be_removed].position] = position_of_number_to_be_removed;
positions[min_heap[position_of_number_to_be_removed/2].position] = position_of_number_to_be_removed/2;
for (j=position_of_number_to_be_removed/2 ; j>1; j=aux1){
aux1 = j/2;
if (min_heap[j].val < min_heap[aux1].val) {
swap(min_heap[j] , min_heap[aux1]);
positions[min_heap[j].position] = j;
positions[min_heap[aux1].position] = aux1;
}
}
}
aux2 = position_of_number_to_be_removed * 2;
aux3 = position_of_number_to_be_removed * 2 + 1;
while ((min_heap[position_of_number_to_be_removed].val > min_heap[aux2].val && min_heap[aux2].val != -1) || (min_heap[position_of_number_to_be_removed].val > min_heap[aux3].val && min_heap[aux3].val != -1)){
int chosen_one;
bool entered = false;
if (min_heap[position_of_number_to_be_removed].val > min_heap[aux2].val && min_heap[position_of_number_to_be_removed].val > min_heap[aux3].val && min_heap[aux2].val != -1 && min_heap[aux3].val != -1){
if (min_heap[aux2].val < min_heap[aux3].val) chosen_one = aux2;
else chosen_one = aux3;
entered = true;
}
if (min_heap[position_of_number_to_be_removed].val > min_heap[aux2].val && min_heap[aux2].val != -1 && (!entered)) chosen_one = aux2;
if (min_heap[position_of_number_to_be_removed].val > min_heap[aux3].val && min_heap[aux3].val != -1 && (!entered)) chosen_one = aux3;
swap (min_heap[position_of_number_to_be_removed] , min_heap[chosen_one]);
positions[min_heap[position_of_number_to_be_removed].position] = position_of_number_to_be_removed;
positions[min_heap[chosen_one].position] = chosen_one;
position_of_number_to_be_removed = chosen_one;
aux2 = position_of_number_to_be_removed *2;
aux3 = position_of_number_to_be_removed * 2 + 1;
}
}
}
ifstream fin;
ofstream fout;
int main (void){
int m;
fin.open("heapuri.in");
fout.open("heapuri.out");
fin>>n;
for (i=1; i<=n; i++){
fin>>query;
switch(query){
case 1:
fin>>curr_read_number.val;
curr_read_number.position = position_of_the_read_number;
position_of_the_read_number++;
add_numbers(curr_read_number);
break;
case 2:
fin>>m;
remove_numbers(positions[m]);
break;
case 3:
fout<<min_heap[1].val<<"\n";
break;
}
}
fin.close();
fout.close();
return 0;
}