Cod sursa(job #2745111)

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

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


void inserare(int elem){
    int size = myHeap.size();
    if (size == 0){
        myHeap.push_back(elem);
        temp.push_back(elem);
    }
    else{
        myHeap.push_back(elem);
        temp.push_back(elem);
        int poz = myHeap.size() - 1; 
        while(poz){
            int tata = (poz - 1) / 2;
            if (myHeap[tata] > myHeap[poz]){
                swap(myHeap[tata], myHeap[poz]);
                poz = tata;    
            }
            else
                break;
        }
    }
}

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();
    int size = myHeap.size();
    int smallest = -1;
    
    while (smallest != poz_in_heap){
        smallest = poz_in_heap;
        int l = (2*poz_in_heap) + 1; // left child
        int r = (2*poz_in_heap) + 2; // right child
        if (l < size && myHeap[l] < myHeap[smallest])
            smallest = l;
        if (r < size && myHeap[r] < myHeap[smallest])
            smallest = r;
        
        if (smallest != poz_in_heap){
            swap(myHeap[smallest], myHeap[poz_in_heap]);
        }
    }
}

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;
}