Pagini recente » Cod sursa (job #1254133) | Cod sursa (job #1300670) | Cod sursa (job #2767738) | Cod sursa (job #1924142) | Cod sursa (job #1881468)
#include <iostream>
#include <fstream>
#define NMAX 200010
using namespace std;
ifstream f ("heapuri.in");
ofstream g ("heapuri.out");
int poz[NMAX], hSize = 0, pSize = 0;
struct bin
{
int value, initialPosition;
};
bin h[NMAX];
void up(int k)
{
bin key = h[k];
while (key.value < h[k / 2].value)
{
h[k] = h[k / 2];
poz[h[k].initialPosition] = k;
k /= 2;
}
poz[key.initialPosition] = k;
h[k] = key;
}
void down(int k)
{
int son;
do
{
son = 0;
if (k * 2 <= hSize)
{
son = k * 2;
if (k * 2 + 1 <= hSize && h[2 * k + 1].value < h[2 * k].value)
son = k * 2 + 1;
if (h[son].value >= h[k].value)
son = 0;
}
if (son)
{
poz[h[k].initialPosition] = son;
poz[h[son].initialPosition] = k;
swap(h[k], h[son]);
k = son;
}
}while (son);
}
int main()
{
int n;
f>>n;
for (int p, x, i = 0; i < n; i++)
{
f>>p;
if (p <= 2)
{
f >> x;
if (p == 1)
{
hSize++;
pSize++;
h[hSize].value = x;
h[hSize].initialPosition = pSize;
poz[pSize] = hSize;
up(hSize);
}
else
{
int heapPosition = poz[x];
bin lastElement = h[hSize];
poz[lastElement.initialPosition] = poz[x];
swap(h[heapPosition], h[hSize]);
hSize--;
down(heapPosition);
up(heapPosition);
}
}
else g<<h[1].value<<'\n';
}
return 0;
}