Pagini recente » Cod sursa (job #844923) | Cod sursa (job #372004)
Cod sursa(job #372004)
#include <cstdio>
#define DIM 200005
typedef int Heap[DIM];
Heap H, v, poz;
int n, index, N, k;
inline int father(int i)
{
return i>>1;
}
inline int left_son(int i)
{
return i<<1;
}
inline int right_son(int i)
{
return (i<<1) + 1;
}
void swap(int &a, int &b)
{
int aux = a;
a = b;
b = aux;
}
void percolate(int i)
{
int este_heap = 0;
while (!este_heap && i > 1)
{
if (v[ H[father(i)] ] > v[ H[i] ])
{
swap(H[father(i)], H[i]);
swap(poz[H[father(i)]], poz[H[i]]);
i >>= 1;
}
else
este_heap = 1;
}
}
void sift(int i)
{
int este_heap = 0;
while (!este_heap && 2 * i <= index)
{
if (v[ H[left_son(i)] ] < v[ H[i] ] || v[ H[right_son(i)] ] < v[ H[i] ])
{
if (v[ H[left_son(i)] ] < v[ H[right_son(i)] ])
swap(v[ H[left_son(i)] ], v[ H[i] ]), i <<= 1;
else
swap(v[ H[right_son(i)] ], v[ H[i] ]),swap(poz[H[right_son(i)]],poz[H[i]]), i <<= 1, ++i ;
}
else
este_heap = 1;
}
}
void add(int x)
{
H[++index] = x;
poz[x] = x;
percolate(index);
}
void afisare()
{
printf ("||------------||\n");
for (int i = 1; i <= index; ++i)
printf ("%3d ", i);
printf ("\n");
for (int i = 1; i <= index; ++i)
printf("%3d ", H[i]);
printf ("\n");
}
void heapsort()
{
index = n;
for (int i = 1; i <= n; ++i)
{
v[index] = H[1];
H[1] = H[index--];
sift(1);
afisare();
}
}
void sterge(int k)
{
int i ;
i = poz[ k ];
H[i] = H[index--];
if ( 2 * i <= index )
if ( v[ H[i] ] > H [left_son(i)] || v[ H[i] ] > H [right_son(i)] )
sift(i);
}
int main()
{
FILE *f = fopen("heapuri.in", "r");
FILE *fout = fopen("heapuri.out", "w");
fscanf(f, "%d", &N);
index = 0;
for (int i = 1, cod, x; i <= N; ++i)
{
fscanf(f, "%d", &cod);
if (cod == 1)
fscanf(f, "%d", &x),v[++k] = x, add(k);
else
if (cod == 2)
fscanf(f, "%d", &x), sterge(x);
else
fprintf(fout, "%d\n", v[ H[1] ]);
}
afisare();
// heapsort();
return 0;
}