Cod sursa(job #3131589)

Utilizator stefanmo03Mocanu Stefan stefanmo03 Data 20 mai 2023 17:37:33
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
//#include <iostream>
#include <fstream>
#include<vector>

using namespace std;
std::ifstream cin("heapuri.in");
std::ofstream cout("heapuri.out");

class Heap{
    vector<pair<int,int>> vals;
    static int x;
    void coboara(int poz){
        if(poz*2+1 < vals.size() && vals[poz].second > vals[poz*2+1].second){
            pair<int,int> temp = vals[poz];
            vals[poz] =vals[poz*2+1];
            vals[poz*2+1]=temp;
            return coboara(poz*2+1);
        }if(poz*2+2 < vals.size() && vals[poz].second > vals[poz*2+2].second){
            pair<int,int> temp = vals[poz];
            vals[poz] =vals[poz*2+2];
            vals[poz*2+2]=temp;
            return coboara(poz*2+2);
        }
    }
public:
    void insert(int v){
        vals.push_back({++x,v});
        int aux = vals.size()-1;
        while(aux && vals[aux].second < vals[(aux-1)/2].second){
            pair<int,int> temp = vals[aux];
            vals[aux] =vals[(aux-1)/2];
            vals[(aux-1)/2]=temp;
            aux = (aux-1)/2;
        }
    }
    void remove(int poz){
        for(int i = 0;i<vals.size();i++){
            if(vals[i].first == poz){
                int aux = vals.size()-1;
                pair<int,int> temp = vals[aux];
                vals[aux] =vals[i];
                vals[i]=temp;
                vals.pop_back();
                aux = i;
                while(aux && vals[aux].second < vals[(aux-1)/2].second){
                    pair<int,int> temp = vals[aux];
                    vals[aux] =vals[(aux-1)/2];
                    vals[(aux-1)/2]=temp;
                    aux = (aux-1)/2;
                }
                coboara(i);
            }
        }
    }
    int top(){
        return vals[0].second;
    }
};
int Heap::x =0;
int main() {
    Heap h;
    int n;
    cin>>n;
    for(int i = 0;i<n;i++){
        int op;
        cin>>op;
        switch(op){
            case 1:{
                int x;
                cin>>x;
                h.insert(x);
                break;
            }
            case 2:{
                int x;
                cin>>x;
                h.remove(x);
                break;
            }
            case 3:{
                cout<<h.top()<<'\n';
            }
        }
    }
    return 0;
}