Cod sursa(job #1227754)

Utilizator george_stelianChichirim George george_stelian Data 11 septembrie 2014 16:11:09
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct ostrucura
{
    int x,poz;
}v[200010];

int h[400010],n,nr,nrheap,i,x;

void downheap(int nod)
{
    int st,dr;
    while(nod*2<=nrheap)
    {
        st=nod*2;
        if(st<nrheap) dr=st+1;
        else dr=0;
        if(v[h[nod]].x>v[h[st]].x || v[h[nod]].x>v[h[dr]].x)
            if(v[h[st]].x<v[h[dr]].x)
            {
                swap(h[nod],h[st]);
                swap(v[h[nod]].poz,v[h[st]].poz);
                nod=st;
            }
            else
            {
                swap(h[nod],h[dr]);
                swap(v[h[nod]].poz,v[h[dr]].poz);
                nod=dr;
            }
        else break;
    }
}

void upheap(int nod)
{
    int t;
    while(nod>1)
    {
        t=nod/2;
        if(v[h[t]].x>v[h[nod]].x)
        {
            swap(h[t],h[nod]);
            swap(v[h[t]].poz,v[h[nod]].poz);
            nod=t;
        }
        else break;
    }
}

int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    scanf("%d",&n);
    v[0].x=1000000010;
    for(;n;n--)
    {
        scanf("%d",&x);
        if(x==1)
        {
            scanf("%d",&x);
            v[++nr].x=x;
            h[++nrheap]=nr;
            v[nr].poz=nrheap;
            upheap(nrheap);
        }
        else if(x==2)
        {
            scanf("%d",&x);
            h[v[x].poz]=h[nrheap];
            v[h[nrheap]].poz=v[x].poz;
            nrheap--;
            downheap(v[x].poz);
        }
        else
        {
            printf("%d\n",v[h[1]].x);
        }
    }
    return 0;
}