Pagini recente » Cod sursa (job #2899692) | Cod sursa (job #405759) | Cod sursa (job #330195) | Cod sursa (job #158753) | Cod sursa (job #1691192)
#include<fstream>
#define nmax 200005
int n, sz, h[nmax], pos_h[nmax], pos_a[nmax], k;
template <class T> void swap(T &a, T &b)
{
T aux;
aux = a;
a = b;
b = aux;
}
void Swap(int x, int y)
{
int a1 = pos_a[x];
int a2 = pos_a[y];
swap(h[x], h[y]);
pos_a[y] = a1;
pos_h[a1] = y;
pos_a[x] = a2;
pos_h[a2] = x;
}
void up(int pos)
{
while (pos > 1 && h[pos] < h[pos / 2])
{
Swap(pos, pos / 2);
pos /= 2;
}
}
void coboara(int pos)
{
while (2 * pos <= sz)
{
int son = 2 * pos;
if (2 * pos + 1 <= sz && h[2 * pos + 1] < h[son]) ++son;
if (h[pos]>h[son])
{
Swap(pos, son);
pos = son;
}
}
}
void ins(int val)
{
h[++sz] = val;
pos_h[k] = sz;
pos_a[sz] = k;
up(sz);
}
void del(int pos)
{
Swap(pos, sz);
--sz;
if (h[pos] < h[pos / 2]) up(pos); else coboara(pos);
}
int main()
{
std::ifstream cin("heapuri.in");
std::ofstream cout("heapuri.out");
cin >> n;
while (n--)
{
int x, y;
cin >> y;
if (y == 1)
{
++k;
cin >> x;
ins(x);
}
if (y == 2)
{
cin >> x;
del(pos_h[x]);
}
if (y == 3)
{
cout << h[1] << "\n";
}
}
return 0;
}