Cod sursa(job #2745080)

Utilizator anaop32Oprea Ana-Maria anaop32 Data 25 aprilie 2021 20:44:21
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;

int nrOp, op;
vector<int> myHeap;
vector<int> temp;

void heapify(int i){
    int size = myHeap.size();
    int smallest = i;
    int l = (2*i) + 1; // left child
    int r = (2*i) + 2; // right child
    if (l < size && myHeap[l] < myHeap[smallest])
        smallest = l;
    if (r < size && myHeap[r] < myHeap[smallest])
        smallest = r;
    
    if (smallest != i){
        swap(myHeap[smallest], myHeap[i]);
        heapify(smallest);
    }

}

void inserare(int elem){
    int size = myHeap.size();
    if (size == 0){
        myHeap.push_back(elem);
        temp.push_back(elem);
    }
    else{
        myHeap.push_back(elem);
        for (int i = size / 2 - 1; i >= 0; i--)
            heapify(i);
    }
}

int gaseste(int elem){
    for (int i = 0; i < myHeap.size(); i++)
        if (elem == myHeap[i])
            return i;
}

void elimina(int poz){
    int elem = temp[poz - 1];
    int poz_in_heap = gaseste(elem);
    swap(myHeap[poz_in_heap], myHeap[myHeap.size() - 1]);
    myHeap.pop_back();
    for (int i = myHeap.size() / 2 - 1; i >= 0; i--)
        heapify(i);
}

int peek(){
    return myHeap[0];
}

ifstream f("heapuri.in");
ofstream g("heapuri.out");

int main(){
    f >> nrOp;
    for (int i = 0; i < nrOp; i++){
        f >> op;
        switch (op){
            case 1: 
                    f >> op;
                    inserare(op);
                    break;
            case 2:
                    f >> op;
                    elimina(op);
                    break;
            case 3:
                    g << peek() << endl;
                    break;
        }
    }

    return 0;
}