Cod sursa(job #2081138)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 4 decembrie 2017 07:53:47
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#define DIM 200005

using namespace std;

int N;
int nr;
int hcnt;
int H[DIM];
int poz[DIM];
int A[DIM];
int op;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

void up(int x){

    int c=x;
    int p=x/2;
    while(p>=1 && A[H[c]] < A[H[p]]){
        swap(H[c],H[p]);
        swap(poz[H[c]],poz[H[p]]);
        c=p;
        p/=2;
    }

}

void down(int x){
    int p=x,c=2*p;
    while(c<=hcnt){
        if(c+1<=hcnt && A[H[c+1]] < A[H[c]])
            c++;
        if(A[H[p]] > A[H[c]]){
            swap(H[p],H[c]);
            swap(poz[H[p]],poz[H[c]]);
            p=c;
            c*=2;
        }
        else
            break;
    }

}
void insert(){
    fin>>A[++nr];
    H[++hcnt]=nr;
    poz[H[hcnt]]=hcnt;
    up(hcnt);

}

void kick(){
    int x;
    fin >> x;
    A[x]=-1;
    up(poz[x]);
    swap(H[1],H[hcnt]);
    swap(poz[H[1]],poz[H[hcnt]]);
    hcnt --;
    down(poz[H[1]]);

}

int main(){

    fin >> N;

    while(N--){
        fin >> op;
        if(op==1)
            insert();
        if(op==2)
            kick();
        if(op==3)
            fout << A[H[1]] << "\n";
    }

}