Cod sursa(job #338702)

Utilizator RobybrasovRobert Hangu Robybrasov Data 6 august 2009 17:37:11
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
/*
    P[i] - Pozitia elementului intrat al i-lea
    H[i] - Indicele elementului i in heap
    C[i] - Cheia elementului i in heap
*/

#include <cstdio>
#define N 200001

int P[N],H[N],C[N];

void down(int tata, int n)
{
    int fiu=tata<<1,val=H[tata];
    if (fiu<n && C[H[fiu+1]]<C[H[fiu]]) fiu++;
    while (fiu<=n && C[val]>C[H[fiu]])
    {
        H[tata]=H[fiu];
        P[H[tata]]=tata;
        tata=fiu; fiu<<=1;
        if (fiu<n && C[H[fiu+1]]<C[H[fiu]]) fiu++;
    }
    H[tata]=val;
    P[H[tata]]=tata;
}

void up(int fiu)
{
    int tata=fiu>>1,val=H[fiu];
    while (tata && C[val]<C[H[tata]])
    {
        H[fiu]=H[tata];
        P[H[fiu]]=fiu;
        fiu=tata; tata>>=1;
    }
    H[fiu]=val;
    P[H[fiu]]=fiu;
}

int main()
{
    int n=0,m,op,x,i,kont=0;
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d",&m);
	while (m--)
	{
	    scanf("%d",&op);
	    if (op==3) printf("%d\n",C[H[1]]);
	    else
	    {
	        scanf("%d",&x);
            if (op==1) //introduc un element nou
            {
                n++; kont++;
                H[n]=kont;
                P[kont]=n;
                C[kont]=x;
                up(n);
            }
            else
                if (op==2) //scot elementul intrat al x-lea in heap
                {
                    H[P[x]]=H[n--];
                    P[H[P[x]]]=P[x];
                    if (C[H[P[x]]]<C[H[P[x]>>1]]) up(P[x]);
                    else down(P[x],n);
                }
	    }
	}

	return 0;
}