Cod sursa(job #1239267)

Utilizator andru47Stefanescu Andru andru47 Data 8 octombrie 2014 17:16:32
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <algorithm>
using namespace std;
struct da
{
    int val,poz;
};
da a[200000];
int n,instr,com,poz[200000],i,x,xx;
void swapp(int pozz)
{
    swap(poz[a[pozz].poz],poz[a[2*pozz].poz]);
    swap(a[pozz],a[2*pozz]);
}
void heapup(int n)
{
    if (n<=1)  return ;
    if (a[n/2].val>a[n].val)
    {
        swapp(n/2);
        heapup(n/2);
    }
}
void heapdown(int n,int r)
{
    int st,dr;
    if (2*r<=n)
    {
        st=a[2*r].val;
        if (2*r+1<=n)dr=a[2*r+1].val;
        else dr=-1;
        if (st<dr||(st>dr&&dr==-1))
        {
            if (a[2*r].val<a[r].val)
            {
                swapp(r);
                heapdown(n,2*r);
            }
        }
        else if (st>dr&&dr!=-1)
        {
            if (a[2*r+1].val<a[r].val)
            {
                //swapp(a[2*r+1],a[r]);
                swap(poz[a[r].poz],poz[a[2*r+1].poz]);
                swap(a[r],a[2*r+1]);
                heapdown(n,2*r+1);
            }
        }
    }
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d ",&instr);
    for (i=1; i<=instr; i++)
    {
        scanf("%d ",&com);
        if (com==1)
        {
            scanf("%d ",&x);
            a[++n].val=x;
            a[n].poz=n;
            poz[n]=n;
            heapup(n);
        }
        else if (com==2)
        {
            scanf("%d ",&x);
            xx=poz[x];
            swap(poz[x],poz[a[n].poz]);
            swap(a[xx],a[n]);
            n--;
            heapdown(n,xx);
        }
        else if (com==3)
        {
            printf("%d\n",a[1]);
        }

    }
    return 0;
}