Cod sursa(job #2202238)

Utilizator daniel.vbVasile Daniel daniel.vb Data 8 mai 2018 07:17:38
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 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]);
        schimba(y[x[k]],y[x[k/2]]);
        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]);
            schimba(y[x[k]],y[x[i]]);
            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;

    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,crt;
    FILE *f,*g;

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

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

    m=0;

    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&o);
        if(o==1)
        {
            fscanf(f,"%d",&j);
            m++;
            a[m]=j;x[m]=i;y[i]=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]);
        }
    }
}