Cod sursa(job #1419123)

Utilizator sulzandreiandrei sulzandrei Data 14 aprilie 2015 18:57:33
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#define rest 200002
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
int leftson(int i)
{
    return (2*i);
}
int rightson(int i)
{
    return(2*i+1);
}
int father(int i)
{
    return(i/2);
}
int P[rest],Ent[rest],H[rest];
void insertHeap(int x,int *n,int nth)
{
    H[++(*n)] = x;
    P[nth] = *n;
    Ent[*n] = nth;
    int pos =*n;
    while( pos>1 && H[pos]<H[father(pos)] )
    {
        swap(P[Ent[pos]],P[Ent[father(pos)]]);
        swap(Ent[pos],Ent[father(pos)]);
        swap(H[pos],H[father(pos)]);
        pos = father(pos);
    }
}
void deleteHeap(int *n,int x)
{
    int pos = P[x],posmin;
    swap(P[x],P[Ent[*n]]);
    swap(Ent[pos],Ent[*n]);
    swap(H[pos],H[*n]);
    (*n)--;
    do
    {
        posmin = pos;
        if( leftson(pos)<=*n && H[leftson(pos)]<H[posmin])
            posmin = leftson(pos);
        if( rightson(pos)<=*n && H[rightson(pos)]<H[posmin])
            posmin = rightson(pos);
        if(posmin == pos)
           break;
        else
        {
            swap(P[Ent[pos]],P[Ent[posmin]]);
            swap(Ent[pos],Ent[posmin]);
            swap(H[pos],H[posmin]);
            pos = posmin;
        }
    }while(1);
}
int main()
{
    int NrEle,cne,n,op,x;
    FILE *f,*g;
    f = fopen("heapuri.in","r");
    g = fopen("heapuri.out","w");
    cne = n = 0;
    fscanf(f,"%d",&NrEle);
    do
    {
        fscanf(f,"%d",&op);
        switch(op)
        {
            case 1 : fscanf(f,"%d",&x); ++cne; insertHeap(x,&n,cne); break;
            case 2 : fscanf(f,"%d",&x); deleteHeap(&n,x); break;
            case 3 : fprintf(g,"%d\n",H[1]);  break;
        }
    }while(--NrEle);
    return 0;
}