Cod sursa(job #3131662)

Utilizator RadushCordunianu Radu Radush Data 20 mai 2023 21:42:06
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
class Heap{
private:
    vector<int> h,ord;
    int parent(int i){ return(i-1)/2; }
    int getst(int i){ return 2*i+1; }
    int getdr(int i){ return 2*(i+1); }
    void heapify(int i){
        int min=i;
        int st=getst(i);
        int dr=getdr(i);
        if(st<h.size() && h[st]<h[min])
            min=st;
        if(dr<h.size() && h[dr]<h[min])
            min=dr;
        if(min!=i){
            swap(h[i],h[min]);
            heapify(min);
        }
    }

public:
    void insert(int val){
        h.push_back(val);
        ord.push_back(val);
        int i=h.size()-1;
        while(i!=0 && h[parent(i)]>h[i]){
            swap(h[i],h[parent(i)]);
            i=parent(i);
        }
        heapify(0);
    }
    void removeat(int x){
        auto it=find(h.begin(),h.end(),ord[x-1]);
        swap(h[it-h.begin()],h[h.size()-1]);
        h.pop_back();
        heapify(0);
    }
    int getFirst(){
        return h[0];
    }
};
int main(){
    int n,s,v;
    Heap h;
    fin>>n;
    for(int i=0;i<n;i++)
    {
        fin>>s;
        switch(s){
            case 1:
                fin>>v;
                h.insert(v);
                break;
            case 2:
                fin>>v;
                h.removeat(v);
                break;
            case 3:
                fout<<h.getFirst()<<"\n";
        }
    }
    return 0;
}