Cod sursa(job #1232887)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 24 septembrie 2014 10:07:21
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<cstdio>

using namespace std;

struct arbre
{
    int val,pos;
};

arbre h[200002];
int k,op,nr,poz[200002],pos,x,n,i,aux;

void swap(int n1,int n2)
{
    int x;
    x=h[n1].val;
    h[n1].val=h[n2].val;
    h[n2].val=x;
    x=h[n1].pos;
    h[n1].pos=h[n2].pos;
    h[n2].pos=x;
    x=poz[h[n1].pos];
    poz[h[n1].pos]=poz[h[n2].pos];
    poz[h[n2].pos]=x;
}

void heapup(int nod)
{
    if(nod>1)
    {
        if(h[nod].val<h[nod/2].val)
        {
            swap(nod,nod/2);
            heapup(nod/2);
        }
    }
}

void heapdown(int nod)
{
    int dr,st;
    if(nod*2<=k)
    {
        st=h[nod*2].val;
        if(nod*2<k)
        {
            dr=h[nod*2+1].val;
        }
        else dr=st+1;
        if(st<dr&&st<h[nod].val)
        {
            swap(nod*2,nod);
            heapdown(nod*2);
        }
        else
        if(dr<st&&dr<h[nod].val)
        {
            swap(nod*2+1,nod);
            heapdown(nod*2+1);
        }
    }
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&op);
        if(op==1)
        {
            k++;
            nr++;
            poz[nr]=k;
            scanf("%d",&x);
            h[k].val=x;
            h[k].pos=nr;
            heapup(k);
        }
        if(op==2)
        {
            scanf("%d",&pos);
            aux=poz[pos];
            swap(poz[pos],k);
            k--;
            heapdown(aux);
        }
        if(op==3)
        {
            printf("%d\n",h[1].val);
        }
    }
    return 0;
}