Pagini recente » Cod sursa (job #1005061) | Cod sursa (job #380025) | Cod sursa (job #1005056) | Cod sursa (job #1292271) | Cod sursa (job #372016)
Cod sursa(job #372016)
#include <cstdio>
#define DIM 200002
int heap[DIM], v[DIM], poz[DIM], n, nrpoz;
void swap(int &a, int &b)
{
int aux = a;
a = b;
b = aux;
}
void add(int x)
{
v[++nrpoz] = x;
heap[++n] = n;
poz[nrpoz]=n;
int este_heap = 0, i = n;
while (!este_heap && i > 1)
{
if (v[ heap[i/2] ] < v[ heap[i] ])
este_heap = 1;
else
{
swap(heap[i], heap[i/2]);
poz[heap[i]] = i;
poz[heap[i/2]] = i/2;
i /= 2;
}
}
}
void sterge(int x)
{
int i = poz[x], k;
bool este_heap = false;
heap[ i ] = heap[n--];
poz[ heap[i] ] = i;
while (!este_heap && 2 * i <= n)
{
k = 2 * i;
if (k + 1 <= n && v[ heap[k] ] > v[ heap[k + 1] ])
++k;
if (v[heap[i]] < v[heap[k]])
este_heap = true;
else
{
swap(heap[i], heap[k]);
poz[heap[i]] = i;
poz[heap[k]] = k;
i = k;
}
}
}
void afisare()
{
for (int i = 1; i <= n; ++i)
printf("%d ", heap[i]);
printf("\n");
}
int main()
{
int nrop, op, x;
FILE *f = fopen("heapuri.in", "r"), *g = fopen("heapuri.out", "w");
fscanf(f, "%d", &nrop);
for (;nrop; --nrop)
{
fscanf(f, "%d", &op);
if (op == 3)
fprintf(g, "%d\n", v[heap[1]]);
else
{
fscanf(f, "%d", &x);
if (op == 1)
add(x);
else
sterge(x);
}
afisare();
}
fcloseall();
return 0;
}