Cod sursa(job #282301)
#include <stdio.h>
int heap[200001], poz[200001], valori[200001], heap_size = 0, k = 0;
void solve();
void push(int);
void move_up(int);
void pop(int);
void move_down(int);
inline void swap(int&, int&);
int main()
{
solve();
return 0;
}
void solve()
{
int i, n, cod, val, j;
FILE *fin = fopen ("heapuri.in", "r"), *fout = fopen ("heapuri.out", "w");
fscanf (fin, "%d", &n);
for (i = 1; i <= n; ++i)
{
fscanf (fin, "%d", &cod);
if (cod == 1)
{
fscanf (fin, "%d", &val);
push (val);
}
else if (cod == 2)
{
fscanf (fin, "%d", &val);
pop(val);
}
else
{
fprintf (fout, "%d\n", valori[heap[1]]);
}
/*
printf ("\n\n codul operatiei: %d", cod);
if (cod != 3)
{
printf (" %d", val);
}
printf ("\nheapul:");
for (j = 1; j <= heap_size; ++j)
{
printf (" %d" , heap[j]);
}
printf ("\nvalori:");
for (j = 1; j <= heap_size; ++j)
{
printf (" %d" , valori[heap[j]]);
}
*/
}
fclose (fin);
fclose (fout);
}
void push(int val)
{
heap[++heap_size] = ++k;
valori[k] = val;
poz[k] = heap_size;
move_up(poz[k]);
}
void move_up(int fiu)
{
int tata = fiu / 2;
if (fiu == 1 || valori[heap[fiu]] >= valori[heap[tata]])
{
return;
}
else
{
swap(heap[fiu], heap[tata]);
swap(poz[heap[tata]], poz[heap[fiu]]);
move_up(tata);
}
}
void pop(int index)
{
index = poz[index];
heap[index] = heap[heap_size];
poz[heap[index]] = index;
--heap_size;
move_down(index);
move_up(index);
}
void move_down(int tata)
{
int fiu;
if (tata * 2 > heap_size)
{
return;
}
else if (tata * 2 == heap_size)
{
fiu = tata * 2;
}
else
{
if (valori[heap[tata * 2]] <= valori[heap[tata * 2 + 1]])
{
fiu = tata * 2;
}
else
{
fiu = tata * 2 + 1;
}
}
if (valori[heap[tata]] <= valori[heap[fiu]])
{
return;
}
else
{
swap(heap[tata], heap[fiu]);
swap(poz[heap[tata]], poz[heap[fiu]]);
move_down(fiu);
}
}
inline void swap (int &a, int &b)
{
int t = a;
a = b;
b = t;
}