Cod sursa(job #2952306)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 8 decembrie 2022 22:52:31
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int dim=2e5+10;

int value[dim],Time;//value[i]=valoarea elementului care a intrat in timpul i
int heap[dim],len;//heap[i]=timpul in care a intrat elementul de pe pozitia i in heap
int pos[dim];//pos[i]=pozitia in heap al elementului care a intrat in timpul i

void UpHead(int child){
    while(child/2){
        int parent=child/2;
        if(value[heap[parent]]>value[heap[child]]){
            swap(heap[parent],heap[child]);
            pos[heap[parent]]=parent;
            pos[heap[child]]=child;

            child=parent;
        }else{
            return;
        }
    }
}

void DownHeap(int parent){
    while(parent*2<=len){
        int lChild=parent*2,rChild=parent*2+1,child=lChild;
        if(rChild<=len&&value[heap[lChild]]>value[heap[rChild]]&&value[heap[parent]]>value[heap[rChild]]){
           child=rChild;
        }
        if(heap[parent]>heap[child]){
            swap(heap[parent],heap[child]);
            pos[heap[parent]]=parent;
            pos[heap[child]]=child;

            parent=child;
        }
    }
}

int main(){
    int nrOp;
    fin>>nrOp;
    while(nrOp--){
        int op;
        fin>>op;
        if(op==1){
            int x;
            fin>>x;
            value[++Time]=x;
            heap[++len]=Time;
            pos[Time]=len;
            UpHead(len);
        }
        if(op==2){
            int x;
            fin>>x;
            swap(heap[pos[x]],heap[len]);
            pos[heap[x]]=x;
            pos[heap[len]]=len;
            len--;
            DownHeap(heap[x]);
        }
        if(op==3){
            fout<<value[heap[1]]<<'\n';
        }
    }
}