Pagini recente » Cod sursa (job #2013824) | Cod sursa (job #404733) | Cod sursa (job #164938) | Cod sursa (job #1908051) | Cod sursa (job #2076669)
#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(contor,contor/2,v);
poz[v[contor]]=contor; poz[v[contor/2]]=contor/2;
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(x,pozmin,v);
poz[v[x]]=x; poz[v[pozmin]]=pozmin;
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(contor,contor/2,v);
poz[v[contor]]=contor; v[contor/2]=contor/2;
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;
}