Cod sursa(job #1842158)

Utilizator tavonSuleyman Magnificul tavon Data 6 ianuarie 2017 16:14:42
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
#include<unordered_set>
using namespace std;
unordered_set<int> S;
const int Nmax = 200001;
class Heap{
private:
    int A[Nmax],K;
    int C[Nmax];
    int P[Nmax],I;
    void rep(int i,int j){
        swap(P[C[i]],P[C[j]]);
        swap(C[i],C[j]);
        swap(A[i],A[j]);
    }
    void upheap(int i){
        if(i/2 && A[i] < A[i/2]){
            rep(i/2,i);
            upheap(i/2);
        }
    }
    void downheap(int i){
        if(2*i+1<=K && A[2*i+1] < A[i] && A[2*i+1]<=A[2*i]){
            rep(i,2*i+1);
            downheap(2*i+1);
        }
        else if(2*i<=K && A[2*i] < A[i]){
            rep(i,2*i);
            downheap(2*i);
        }
    }
public:
    void insert(int x){
        A[++K]=x;
        P[++I]=K;
        C[K]=I;
        upheap(K);
    }
    void rem_ind(int x){
        int pos=P[x];
        rep(pos,K);
        K--;
        downheap(pos);
    }
    int top(){
        return A[1];
    }
} H;
int n,x,y;
int main(){
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    while(n--){
        scanf("%d",&x);
        if(x<3) scanf("%d",&y);
        if(x==1) H.insert(y);
        if(x==2) H.rem_ind(y);
        if(x==3) printf("%d\n",H.top());
    }
    return 0;
}