Cod sursa(job #2773883)

Utilizator DianaZaharia132nr2Zaharia Diana Cristiana DianaZaharia132nr2 Data 9 septembrie 2021 09:52:18
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include<iostream>
#include <bits/stdc++.h>
#include<fstream>
using namespace std;
vector <int> h; //construim heap sub forma de vector de numere intregi
int mini,pm;
void reheapup(int p) //functie pentru repararea heap-ului care urca elementul pe pozitia corecta
{
    while(p)
    {
        int tata=(p-1)/2;
        if(h[tata]<h[p])
        {
            swap(h[tata],h[p]);
            p=tata;
        }
        else{
            break;
        }
    }
}

void reheapdown(int p)//functie pentru coborarea radacinii catre pozitia corecta in heap
{
    if(p*2+1 >= (int)h.size())
        return;
    int st = h[p*2+1]; int dr = h[p*2+2];
    if( ((p*2+2)==(int)h.size()) || st>dr )
    {
        if(st > h[p])
        {
            swap(h[p], h[p*2+1]);
            reheapdown(p*2+1);
            return;
        }
        else{
            return;
        }
    }
    else
    {
        if(dr>h[p])
        {
            swap(h[p],h[p*2+2]);
            reheapdown(p*2+2);
            return;
        }
        else{
            return;
        }
    }
}

void insertion(int x) //functie inserare
{
    h.push_back(x);
    reheapup(h.size()-1);
}

void sterge(int i) //functie stergere element pozitia i
{
    h[i] = h[h.size()-1];
    h.pop_back();
    reheapdown(i);
    reheapup(i);
}
void fmini(int &mini) //functie gasire minim
{
    if((int)h.size()==0)
        mini=-1;
    else
    {
        mini= h[h.size()-1];
        for(int i=h.size()-2;i>=(int)h.size()/2;i--)
        {
            if(h[i]<mini)
            {
                mini=h[i];
            }
        }

    }
}


int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    int N,x,cod,mini;
    f>>N;
    for(int i=1; i<=N; i++)
    {
        f>>cod;
        if(cod!=3)
            f>>x;
        switch(cod)
        {
        case 1:
        {
           insertion(x);
        }
        break;
        case 2:
            {sterge(x);}
            break;
        case 3:
            {
          fmini(mini);
         g<<mini<<'\n';
            }
            break;
        }
    }

}