Cod sursa(job #1239484)

Utilizator andru47Stefanescu Andru andru47 Data 9 octombrie 2014 08:18:51
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <algorithm>
using namespace std;
struct da
{
    int val,poz;
};
da a[200001];
int n,instr,com,poz[200001],i,x,xx;
void swapp(int x,int y)
{
    swap(a[x].val,a[y].val);
    swap(a[x].poz,a[y].poz);
    swap(poz[a[x].poz],poz[a[y].poz]);
}
void heapup(int nn)
{
    if (nn<=1)  return ;
    if (a[nn/2].val>a[nn].val)
    {
        swapp(nn/2,nn);
        heapup(nn/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=st+1;
        if (st<=dr)
        {
            if (a[2*r].val<a[r].val)
            {
                swapp(r,2*r);
                heapdown(n,2*r);
            }
        }
        else if (st>dr)
        {
            if (a[2*r+1].val<a[r].val)
            {
                swapp(r,2*r);
                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];
            swapp(xx,n);
            n--;
            heapdown(n,xx);
        }
        else if (com==3)
        {
            printf("%d\n",a[1].val);
        }

    }
    return 0;
}