Cod sursa(job #1524180)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 13 noiembrie 2015 16:52:14
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>

using namespace std;

int jh,v[200100],heap[200100],poz[200100];

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

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

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