Pagini recente » Istoria paginii runda/redsnow_2 | Monitorul de evaluare | Monitorul de evaluare | Diferente pentru runda/redsnow_3 intre reviziile 38 si 37 | Cod sursa (job #2076656)
#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;
}