Cod sursa(job #2076656)

Utilizator biaiftimeIftime Bianca biaiftime Data 26 noiembrie 2017 21:37:51
Problema Heapuri Scor 20
Compilator c Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>
FILE *f,*g;
int *v,*poz,*v_int,n;
int nrnod,nrelem;
//v-heap
//v_int valorile in ordinea in care au fost citite
//poz pe ce pozitie se afla elementul care a intrat al i-lea
void Swap(int i,int j,int *v)
{
    int aux=v[i];
    v[i]=v[j];
    v[j]=aux;
}
void Inserare(int x)
{
    int contor;
    ++nrelem;
    v_int[nrelem]=x;
    v[++nrnod]=nrelem;
    poz[nrelem]=nrnod;
    contor=nrnod;
    while(contor>=2&&v_int[v[contor]]<v_int[v[contor/2]]){
        Swap(v[contor],v[contor/2],poz);
        Swap(contor,contor/2,v);
        contor/=2;}
}
void Minheapify(int x)
{
    if(x<=nrnod/2)
    {int pozmin;
    if(2*x==nrnod)pozmin=nrnod;
    else if(v_int[v[2*x]]<v_int[v[2*x+1]])pozmin=2*x;
         else pozmin=2*x+1;
    if(v_int[v[x]]>v_int[v[pozmin]]){
             Swap(v[x],v[pozmin],poz);
             Swap(x,pozmin,v);
             Minheapify(pozmin); }
    }
}
void Sterge(int x)
{
    Swap(nrnod,poz[x],v);
    --nrnod;
    int contor=poz[x];
    while(contor>=2&&v_int[v[contor]]<v_int[v[contor/2]]){
        Swap(v[contor],v[contor/2],poz);
        Swap(contor,contor/2,v);
        contor/=2;}
    Minheapify(poz[x]);
}
int main()
{
    int i,cod,x;
    f=fopen("heapuri.in","r");
    g=fopen("heapuri.out","w");
    fscanf(f,"%d",&n);
    v=(int *)malloc(n*sizeof(int));
    v_int=(int *)malloc(n*sizeof(int));
    poz=(int *)malloc(n*sizeof(int));
    for(i=1;i<=n;++i)
    {
        fscanf(f,"%d",&cod);
        if(cod==3)fprintf(g,"%d\n",v_int[v[1]]);
        else{
            fscanf(f,"%d",&x);
            if(cod==1)Inserare(x);
            if(cod==2)Sterge(x);
            }
    }
    return 0;
}