Cod sursa(job #2202242)

Utilizator daniel.vbVasile Daniel daniel.vb Data 8 mai 2018 07:53:38
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>

int n,a[200005],x[200005],y[200005],m;

void schimba(int &a,int &b)
{
    int aux;
    aux=a; a=b; b=aux;
}


void swim(int k,int m,int *a,int *x,int *y)
{
    while(k>1 && a[k]<a[k/2])
    {
        schimba(a[k],a[k/2]);
        y[x[k]]=k/2;y[x[k/2]]=k;
        schimba(x[k],x[k/2]);
        k=k/2;
    }
}

void sink(int k,int m,int *a,int *x,int *y)
{
    int i=2*k;
    while(i<=m)
    {
        if(a[i+1]<a[i])
            i++;
        if(a[i]<a[k])
        {
            schimba(a[k],a[i]);
            y[x[k]]=i,y[x[i]]=k;
            schimba(x[k],x[i]);
            k=k/2;
        }
        else
            break;
        k=i;i=2*k;
    }
}


int sterge(int k,int &m,int *a,int *x,int *y)
{
    int crt=a[k],i,j;
/*
    printf("%\n%d\n",k);
    for(i=1;i<=m;i++)
        printf("%4d ",a[i]);
    printf("\n");
    for(i=1;i<=m;i++)
        printf("%4d ",x[i]);
    printf("\n");
    for(i=1;i<=m;i++)
        printf("%4d ",y[i]);
    printf("\n");
*/
    a[k]=a[m];x[k]=x[m];
    y[x[k]]=k;
    m--;
    if(k>1 && a[k]<a[k/2])
        swim(k,m,a,x,y);
    else
        sink(k,m,a,x,y);
   return crt;
}

int main()
{
    int i,j,k,o,nei;
    FILE *f,*g;

    f=fopen("heapuri.in","r");
    g=fopen("heapuri.out","w");

    fscanf(f,"%d",&n);

    m=0;nei=0;

    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&o);
        if(o==1)
        {
            fscanf(f,"%d",&j);
            m++;nei++;
            a[m]=j;x[m]=nei;y[nei]=m;
            swim(m,m,a,x,y);
        }
        if(o==2)
        {
            fscanf(f,"%d",&j);
            k=y[j];
            sterge(k,m,a,x,y);
        }
        if(o==3)
        {
            fprintf(g,"%d\n",a[1]);
        }
    }
}