Cod sursa(job #2433086)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 25 iunie 2019 19:38:24
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 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],Poz[MAX]   ,sz,nr;

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

        switch(task){
            case 1:
                A[++nr]=x;
                Heap[++sz]=nr;
                Poz[nr]=sz;
                x=sz;
                while(x/2&&A[Heap[x/2]]>A[Heap[x]]){
                    swap(Heap[x/2],Heap[x]);
                    swap(Poz[Heap[x/2]],Poz[Heap[x]]);
                    x/=2;
                }
            break;
            case 2:
                x=Poz[x];
                while(x*2+1<=sz){
                    if(A[Heap[x*2]]<A[Heap[x*2+1]]){
                        swap(Heap[x*2],Heap[x]);
                        swap(Poz[Heap[x*2]],Poz[Heap[x]]);
                        x*=2;
                    }else{
                        swap(Heap[x*2+1],Heap[x]);
                        swap(Poz[Heap[x*2+1]],Poz[Heap[x]]);
                        x=x*2+1;
                    }
                }
                if(x*2<=sz){
                    swap(Heap[x*2],Heap[x]);
                    swap(Poz[Heap[x*2]],Poz[Heap[x]]);
                }
                --sz;
            break;
            case 3:
                fout<<A[Heap[1]]<<'\n';
            break;
        }
    }
    return 0;
}