Cod sursa(job #2433158)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 26 iunie 2019 00:55:15
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#define MAX (int)(2e5+5)
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int n,Heap[MAX*4],A[MAX],PozInHeap[MAX],sz,nr;

int main(){
    int i,task,x,y;
    fin>>n;
    while(n--){
        fin>>task;
        if(task<3)
            fin>>x;

        switch(task){
            case 1:
                A[++nr]=x;
                Heap[++sz]=nr;
                PozInHeap[nr]=sz;
                x=sz;
                while(x/2&&A[Heap[x/2]]>A[Heap[x]]){
                    swap(PozInHeap[Heap[x/2]],PozInHeap[Heap[x]]);
                    swap(Heap[x/2],Heap[x]);
                    x/=2;
                }
            break;
            case 2:
                x=PozInHeap[x];

                while(Heap[x*2+1]||A[Heap[x*2]]){
                    if(A[Heap[x*2]]<A[Heap[x*2+1]]&&A[Heap[x*2]]){
                        swap(Heap[x*2],Heap[x]);
                        swap(PozInHeap[Heap[x*2]],PozInHeap[Heap[x]]);
                        x*=2;
                    }else if(A[Heap[x*2+1]]){
                        swap(Heap[x*2+1],Heap[x]);
                        swap(PozInHeap[Heap[x*2+1]],PozInHeap[Heap[x]]);
                        x=x*2+1;
                    }else{
                        swap(Heap[x*2],Heap[x]);
                        swap(PozInHeap[Heap[x*2]],PozInHeap[Heap[x]]);
                        x*=2;
                    }
                }
                if(Heap[x*2]){
                    swap(PozInHeap[Heap[x*2]],PozInHeap[Heap[x]]);
                    swap(Heap[x*2],Heap[x]);
                    x*=2;
                }

                Heap[x]=0;
            break;
            case 3:
                fout<<A[Heap[1]]<<'\n';
            break;
        }
    }
    return 0;
}