Cod sursa(job #2745132)

Utilizator anaop32Oprea Ana-Maria anaop32 Data 25 aprilie 2021 22:05:39
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 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;
        }
    }
}


void elimina(int poz){
    int elem = temp[poz - 1];
    int poz_in_heap;
    
    for (int i = 0; i < myHeap.size(); i++)
        if (elem == myHeap[i])
            poz_in_heap = i;
            
    swap(myHeap[poz_in_heap], myHeap[myHeap.size() - 1]);
    myHeap.pop_back();
    int size = myHeap.size();
    int y = -1;

    while (poz_in_heap!= y){
        y = poz_in_heap;
        if (y * 2 + 1 < size && myHeap[poz_in_heap] > myHeap[y * 2 + 1])
            poz_in_heap = y * 2 + 1;
        if (y * 2 + 2 < size && myHeap[poz_in_heap] > myHeap[y * 2 + 2])
            poz_in_heap = y * 2 + 2;
        
        if (y != poz_in_heap){
            swap(myHeap[y], myHeap[poz_in_heap]);
        }
    }
}

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

int main(){
    f >> nrOp;
    for (int i = 0; i < nrOp; i++){
        f >> op;
        int x;
        if (op <= 2)
            f >> x;
        switch (op){
            case 1: 
                    inserare(x);
                    break;
            case 2:
                    elimina(x);
                    break;
            case 3:
                    g << myHeap[0] << '\n';
                    break;
        }
    }

    return 0;
}