Cod sursa(job #744855)

Utilizator gabrielvGabriel Vanca gabrielv Data 9 mai 2012 20:34:11
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<cstdio>
#define NMAX 200005
#define NMAX2 1000000005

using namespace std;
int H[NMAX],Idx[NMAX2],Ord[NMAX];
int n,k;

inline unsigned father(unsigned nod)
{
    return nod>>1;
}
inline unsigned left_son(unsigned nod)
{
    return nod<<1;
}
inline unsigned right_son(unsigned nod)
{
    return (nod<<1)+1;
}
void percolate(int N, int i)
{
    int aux;
    while(i>1 && H[i]<H[father(i)])
    {
        aux=Idx[H[i]];
		Idx[H[i]]=Idx[H[father(i)]];
		Idx[H[father(i)]]=aux;

		aux=H[i];
		H[i]=H[father(i)];
		H[father(i)]=aux;
		
		i=father(i);
    }
}
void sift(int N, int i)
{
    int aux,son;
    do
    {
        son=0;
        if(left_son(i)<=N)
        {
            son=left_son(i);
            if(right_son(i)<=N && H[son]>H[right_son(i)])
                son=right_son(i);
            if(H[son]>H[i])
                son=0;
        }
        if(son)
        {
            aux=Idx[H[i]];
            Idx[H[i]]=Idx[H[son]];
            Idx[H[son]]=aux;

            aux=H[i];
            H[i]=H[son];
            H[son]=aux;

            i=son;
        }
    }while(son);
}
void insert(int x)
{
    n++;
    k++;
    H[n]=x;
    Idx[x]=n;
    Ord[n]=x;
    percolate(n,n);
}
void cut(int x)
{
    H[Idx[Ord[x]]]=H[n];
    n--;
    if(x>1 && H[Idx[Ord[x]]]<H[father(Idx[Ord[x]])])
        percolate(n,Idx[Ord[x]]);
    else
        sift(n,Idx[Ord[x]]);
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int op,x,m;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d",&op);
        if(op==3)
            printf("%d\n",H[1]);
        else
        {
            scanf("%d",&x);
            if(op==1)
                insert(x);
            else
                cut(x);
        }
    }
    return 0;
}