Cod sursa(job #2603243)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 18 aprilie 2020 19:40:31
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int nr1=0,arb[200010],v[200010],poz[200010];

void up_heap(int nod)
{
    for(;nod>1 && v[arb[nod]]<v[arb[nod/2]];nod/=2)
    {
        swap(arb[nod],arb[nod/2]);
        swap(poz[arb[nod]],poz[arb[nod/2]]);
    }
}

void down_heap(int nod)
{
    while((nod*2<=nr1 && v[arb[nod]]>v[arb[nod*2]]) or (nod*2+1<=nr1 && v[arb[nod]]>v[arb[nod*2+1]]))
        if(nod*2+1<=nr1 && v[arb[nod*2+1]]<v[arb[nod*2]]) {swap(arb[nod],arb[nod*2+1]);swap(poz[arb[nod]],poz[arb[nod*2+1]]);nod=nod*2+1;}
        else {swap(arb[nod],arb[nod*2]);swap(poz[arb[nod]],poz[arb[nod*2]]);nod=nod*2;}

}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int n,cod,nr=0,x;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&cod);
        if(cod==1) {nr1++;nr++;scanf("%d",&v[nr]);arb[nr1]=nr;poz[nr]=nr1;up_heap(nr1);}
        if(cod==2) {scanf("%d",&x);arb[poz[x]]=arb[nr1];poz[arb[nr1]]=poz[x];nr1--;up_heap(poz[x]);down_heap(poz[x]);}
        if(cod==3) printf("%d\n",v[arb[1]]);
    }
    return 0;
}