Pagini recente » Cod sursa (job #282832) | Cod sursa (job #1191440) | Cod sursa (job #424825) | Cod sursa (job #1380136) | Cod sursa (job #2759998)
#include <stdio.h>
#include <stdlib.h>
#define N 200001
int v[N], h[N], poz[N], nh, n;
void schimba(int p1, int p2)
{
///schimba intre ele elem. de pe poz. p1 si p2
int aux = h[p1];
h[p1] = h[p2];
h[p2] = aux;
poz[h[p1]] = p1;
poz[h[p2]] = p2;
}
void urca(int p)
{
while (p > 1 && v[h[p]] < v[h[p/2]])///cat timp elem. curent e mai bun ca tatal sau
{
schimba(p, p/2);
p /= 2;///continuam urcarea
}
}
void adauga(int val)
{
h[++nh] = val;///il pun la final pentru a avea arb. bin. complet
urca(nh);///pentru a pastra proprietatea de heap
}
void coboara(int p)
{
///daca h[p] e mai rau ca (cel putin) unul dintre fii
///il schimb cu cel mai bun dintre fii
int fs = 2*p, fd = 2*p + 1, bun = p;
if (fs <= nh && v[h[fs]] < v[h[bun]])///fiul stang exista si e mai bun ca tatal
{
bun = fs;
}
if (fd <= nh && v[h[fd]] < v[h[bun]])///fiul drept exista si e mai bun ca tatal
{
bun = fd;
}
if (bun != p)///unul dintre fii e mai bun ca tatal
{
schimba(p, bun);
coboara(bun);///coboram in continuare pentru a reface heap-ul
}
}
void sterge(int p)
{
///sterge elem. de pe pozitia p in heap
if (p == nh)
{
nh--;
}
else
{
h[p] = h[nh--];
poz[h[p]] = p;
urca(p);
coboara(p);
}
}
int main()
{
FILE *in, *out;
in = fopen("heapuri.in", "r");
out = fopen("heapuri.out", "w");
int i, nop;
fscanf(in, "%d", &nop);
for (i = 0; i < nop; i++)
{
int tip;
fscanf(in, "%d", &tip);
if (tip == 1)
{
int aux;
fscanf(in, "%d", &aux);
v[++n] = aux;
adauga(n);
}
else if (tip == 2)
{
int p;
fscanf(in, "%d", &p);
sterge(poz[p]);
}
else
{
fprintf(out, "%d\n", v[h[1]]);
}
}
fclose(in);
fclose(out);
return 0;
}