Cod sursa(job #2037163)

Utilizator tqmiSzasz Tamas tqmi Data 11 octombrie 2017 20:21:08
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#define Nmax 200005
using namespace std;

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

int Val[Nmax],Poz[Nmax],Heap[Nmax];
int NHeap,K,op,N,x;



void upHeap(int POZ){
    if(POZ == 1) return;
    int father = POZ / 2;
    if(Val[Heap[father]] > Val[Heap[POZ]]){
        swap(Heap[father],Heap[POZ]);
        swap(Poz[Heap[father]],Poz[Heap[POZ]]);
        upHeap(father);
    }
    return;
}

void downHeap(int POZ){
    int sonl = POZ*2;
    int sonr = POZ*2+1;
    if(sonl > NHeap && sonr > NHeap) return;
    if(Val[Heap[sonl]] < Val[Heap[POZ]]){
        swap(Heap[sonl],Heap[POZ]);
        swap(Poz[Heap[sonl]],Poz[Heap[POZ]]);
        downHeap(sonl);
    }
    if(sonr <= NHeap && Val[Heap[sonr]] < Val[Heap[POZ]]){
        swap(Heap[sonr],Heap[POZ]);
        swap(Poz[Heap[sonr]],Poz[Heap[POZ]]);
        downHeap(sonr);
    }

}

int main()
{
    fin>>N;
    while(N--){
        fin>>op;
        switch(op){
        case 1:
            fin>>x;
            NHeap++;
            Val[++K] = x;
            Poz[K] = NHeap;
            Heap[NHeap] = K;
            upHeap(NHeap);
            break;
        case 2:
            fin>>x;
            Heap[Poz[x]] = Heap[NHeap];
            Poz[Heap[NHeap]] = Poz[x];
            NHeap--;
            downHeap(Poz[x]);
            break;
        case 3:
            fout<<Val[Heap[1]]<<"\n";
            break;
        }
    }
    return 0;
}