Cod sursa(job #393720)

Utilizator MKLOLDragos Ristache MKLOL Data 9 februarie 2010 21:01:38
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<stdio.h>
#define Nmax 200010
int h[Nmax],v[Nmax],l[Nmax],K,Q,N,o=0;
int tata(int k)
{
    return (k/2);
}
int fiu1(int k)
{
    return 2*k;
}
int fiu2(int k)
{
    return 2*k+1;
}

void swap(int x,int y)
{
    int aux;

    aux=h[x];
    h[x]=h[y];
    h[y]=aux;
    v[h[x]]=x;
v[h[y]]=y;

}
void afis(int q)
{
    for(int i=1;i<=K;++i)
    printf("%d ",l[h[i]]);
    printf("\n");
    for(int i=1;i<=q;++i)
    printf("%d ",v[i]);
    printf("\n");
}
int up_heap(int k)
{//afis();
    if(k==1)
    return 0;
    int t;
    t=tata(k);
    if(l[h[t]]>l[h[k]])
    {
    swap(t,k);
    up_heap(t);
    }

    return 0;
}

int down_heap(int k)
{//printf("%d\n",k);

    int s1=fiu1(k),s2=fiu2(k);
    if(s1<=K&&s2<=K)
    {
    if(l[h[s1]]<l[h[s2]])
    {
        if(l[h[k]]>l[h[s1]])
        {
            swap(k,s1);
            down_heap(s1);
        }
    }
    else if(s2<=K)
    {
        if(l[h[k]]>l[h[s2]])
        {
            swap(k,s2);
            down_heap(s2);
        }
    }
    }
    else if(s1<=K)
    {
        if(l[h[k]]>l[h[s1]])
        {
            swap(k,s1);
            down_heap(s1);
        }
    }


}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int x,y;
scanf("%d",&N);
for(int i=1;i<=N;++i)
{//afis(o);

    scanf("%d",&x);
    if(x==1)
    {
    scanf("%d",&l[++o]);
    h[++K]=o;
    v[o]=K;
    //printf("%d \n",K);
    up_heap(K);
    }
    if(x==2)
    {

    scanf("%d",&y);

    swap(v[y],K);
--K;
        up_heap(v[K]);
        down_heap(v[K]);


    }

if(x==3)
{
printf("%d\n",l[h[1]]);
//afis();
}
}
return 0;
}