Pagini recente » Cod sursa (job #264353) | Cod sursa (job #268329) | Cod sursa (job #1734200) | Cod sursa (job #2871676) | Cod sursa (job #1419123)
#include <stdio.h>
#define rest 200002
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
int leftson(int i)
{
return (2*i);
}
int rightson(int i)
{
return(2*i+1);
}
int father(int i)
{
return(i/2);
}
int P[rest],Ent[rest],H[rest];
void insertHeap(int x,int *n,int nth)
{
H[++(*n)] = x;
P[nth] = *n;
Ent[*n] = nth;
int pos =*n;
while( pos>1 && H[pos]<H[father(pos)] )
{
swap(P[Ent[pos]],P[Ent[father(pos)]]);
swap(Ent[pos],Ent[father(pos)]);
swap(H[pos],H[father(pos)]);
pos = father(pos);
}
}
void deleteHeap(int *n,int x)
{
int pos = P[x],posmin;
swap(P[x],P[Ent[*n]]);
swap(Ent[pos],Ent[*n]);
swap(H[pos],H[*n]);
(*n)--;
do
{
posmin = pos;
if( leftson(pos)<=*n && H[leftson(pos)]<H[posmin])
posmin = leftson(pos);
if( rightson(pos)<=*n && H[rightson(pos)]<H[posmin])
posmin = rightson(pos);
if(posmin == pos)
break;
else
{
swap(P[Ent[pos]],P[Ent[posmin]]);
swap(Ent[pos],Ent[posmin]);
swap(H[pos],H[posmin]);
pos = posmin;
}
}while(1);
}
int main()
{
int NrEle,cne,n,op,x;
FILE *f,*g;
f = fopen("heapuri.in","r");
g = fopen("heapuri.out","w");
cne = n = 0;
fscanf(f,"%d",&NrEle);
do
{
fscanf(f,"%d",&op);
switch(op)
{
case 1 : fscanf(f,"%d",&x); ++cne; insertHeap(x,&n,cne); break;
case 2 : fscanf(f,"%d",&x); deleteHeap(&n,x); break;
case 3 : fprintf(g,"%d\n",H[1]); break;
}
}while(--NrEle);
return 0;
}