Pagini recente » Cod sursa (job #1862527) | Cod sursa (job #3136837) | Cod sursa (job #2855288) | Cod sursa (job #2862243) | Cod sursa (job #1789399)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 200000;
int heap[4 * NMAX + 5], poz[NMAX + 5];
int v[NMAX + 5], n, p, k, st, dr, best;
inline void adaug(int x)
{
v[++n] = x;
heap[++k] = n;
poz[n] = k;
p = k;
while (p > 1 && v[heap[p]] < v[heap[p >> 1]])
{
swap(poz[heap[p]], poz[heap[p >> 1]]);
swap(heap[p], heap[(p >> 1)]);
p >>= 1;
}
}
inline void elimin(int x)
{
p = poz[x];
swap(poz[heap[p]], poz[heap[k]]);
swap(heap[p], heap[k]);
--k;
while (p > 1 && v[heap[p]] < v[heap[p >> 1]])
{
swap(poz[heap[p]], poz[heap[p >> 1]]);
swap(heap[p], heap[(p >> 1)]);
p >>= 1;
}
while ((p << 1) <= k)
{
st = (p << 1); dr = st + 1;
best = st;
if (dr <= k && v[heap[st]] > v[heap[dr]])
best = dr;
if (v[heap[p]] > v[heap[best]])
{
swap(poz[heap[p]], poz[heap[best]]);
swap(heap[p], heap[(best)]);
}
else
break;
p = best;
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int m, test, x;
scanf("%d", &m);
for (register int op = 1; op <= m; ++op)
{
scanf("%d", &test);
if (test == 1)
{
scanf("%d", &x);
adaug(x);
}
else if (test == 2)
{
scanf("%d", &x);
elimin(x);
}
else
printf("%d\n", v[heap[1]]);
}
return 0;
}