Cod sursa(job #2564446)

Utilizator tudorcioc5Cioc Tudor tudorcioc5 Data 1 martie 2020 21:28:49
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.36 kb
#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_in_the_heap (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_in_the_heap[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_in_the_heap[min_heap[j].position] = j;
            positions_in_the_heap[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) {

        positions_in_the_heap[min_heap[position_of_number_to_be_removed].position] = 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_in_the_heap[min_heap[position_of_number_to_be_removed].position] = position_of_number_to_be_removed;
            positions_in_the_heap[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_in_the_heap[min_heap[j].position] = j;
                positions_in_the_heap[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_in_the_heap[min_heap[position_of_number_to_be_removed].position] = position_of_number_to_be_removed;
            positions_in_the_heap[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_in_the_heap[m]);
                break;

            case 3:
                fout<<min_heap[1].val<<"\n";
                break;
        }

    }

    fin.close();
    fout.close();

    return 0;
}