Pagini recente » Cod sursa (job #1713974) | Cod sursa (job #496594) | Cod sursa (job #2484752) | Cod sursa (job #395069) | Cod sursa (job #358131)
Cod sursa(job #358131)
#include <stdio.h>
int M;
int heap[10024], N;
void insereaza(int x)
{
heap[++N] = x;
int nod, aux;
for (nod = N; nod > 1; nod /= 2)
if (heap[nod] < heap[nod/2])
aux = heap[nod],
heap[nod] = heap[nod/2],
heap[nod/2] = aux;
}
void stergere(int nod)
{
// aducem ultimul din heap pe pozitia nodului nod
heap[nod] = heap[N];
--N;
// facem coborarea nodului nod
for (; nod * 2 <= N; )
{
// vedem care din cei maxim 2 fii este mai mic
int val = heap[2 * nod], imin = 2 * nod;
if (nod * 2 + 1 <= N && heap[2 * nod + 1] < heap[2 * nod])
val = heap[2 * nod + 1], imin = 2 * nod + 1;
if (heap[nod] <= heap[imin])
return ;
int aux = heap[nod];
heap[nod] = heap[imin];
heap[imin] = aux;
nod = imin;
}
}
int main()
{
int i, tip, x, nod;
freopen("heap.in", "r", stdin);
scanf("%d", &M);
for (i = 1; i <= M; ++i)
{
scanf("%d", &tip);
if (tip == 1) // inserare a unei valori
{
scanf("%d", &x);
insereaza(x);
}
else if (tip == 2) // stergere a unui nod de indice dat
{
scanf("%d", &nod);
stergere(nod);
}
else if (tip == 3) // interogare minim
printf("%d\n", heap[1]);
}
return 0;
}