Cod sursa(job #2895663)

Utilizator cosminnnnnnnaDuca Cosmina cosminnnnnnna Data 29 aprilie 2022 12:41:27
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#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;
}