Cod sursa(job #3131674)

Utilizator RadushCordunianu Radu Radush Data 21 mai 2023 01:44:09
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <climits>
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);
        }
    }
    void helperRemove(int i){
        h[i]=INT_MIN;
        while(i!=0&&h[parent(i)]>h[i]){
            swap(h[i],h[parent(i)]);
            i=parent(i);
        }
    }
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);
        }
    }
    void removeat(int x){
        int i;
        for(i=0;i<h.size();i++)
            if(h[i]==ord[x-1])
                break;
        helperRemove(i);
        h[0]=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;
}