Cod sursa(job #1044124)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 29 noiembrie 2013 12:41:07
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<cstdio>

using namespace std;

int a[200001],h[200001],poz[200001],lg,op,i,nr,x,aux,p;

void swap(int i,int j)
{
    int aux;
    aux=h[i];
    h[i]=h[j];
    h[j]=aux;
    poz[h[j]]=j;
    poz[h[i]]=i;
}

void heapup(int i)
{
    int aux;
    if(a[h[i]]<a[h[i/2]]&&i>1)
    {
        swap(i/2,i);
        heapup(i/2);
    }
}

void heapdown(int i,int lg)
{
    if(2*i<=lg)
    {
        if(2*i+1<=lg)
        {
            if(a[h[i*2]]<a[h[i*2+1]]&&a[h[i*2]]<a[h[i]])
            {
                swap(2*i,i);
                heapdown(2*i,lg);
            }
            else if(a[h[i*2+1]]<a[h[i*2]]&&a[h[i*2+1]]<a[h[i]])
            {
                swap(2*i+1,i);
                heapdown(2*i+1,lg);
            }
        }
        else if(a[h[i*2]]<a[h[i]])
        {
            swap(2*i,i);
            heapdown(2*i,lg);
        }
    }
}


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