Pagini recente » Cod sursa (job #464715) | Cod sursa (job #1989826) | Cod sursa (job #1784713) | Cod sursa (job #693808) | Cod sursa (job #357532)
Cod sursa(job #357532)
#include <cstdio>
#define FIN "heapuri.in"
#define FOUT "heapuri.out"
#define N 200001
int h[N], m, v[N], a[N];
void swap(int a, int b, int V[])
{
int aux;
aux = V[a];
V[a] = V[b];
V[b] = aux;
}
void down_heap(int i, int n)
{
int j = i;
if (2 * i <= n && h[j] > h[2 * i])
j = 2 * i;
if (2 * i + 1 <= n && h[j] > h[2 * i + 1])
j = 2 * i + 1;
if (i != j)
{
v[a[i]] = j;
v[a[j]] = i;
swap(i, j, a);
swap(i, j, h);
down_heap(j, n);
}
}
void up_heap(int i, int n)
{
if (i > 1 && h[i] < h[i / 2])
{
v[a[i]] = i / 2;
v[a[i / 2]] = i;
swap(i, i / 2, a);
swap(i, i / 2, h);
up_heap(i / 2, n);
}
}
void insert(int x, int p)
{
h[++ m] = x;
v[p] = m;
a[m] = p;
up_heap(m, m);
}
void del(int p)
{
//int x = a[m];
swap(v[p], m, h);
v[a[m]] = v[p];
a[v[p]] = a[m];
-- m;
down_heap(v[p], m);
up_heap(v[p], m);
}
int main()
{
int i, x, y, n, k = 0;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d", &n);
for (i = 1; i <= n; ++ i)
{
scanf("%d", &x);
if (x == 1)
{
++ k;
scanf("%d", &y);
insert(y, k);
}
if (x == 2)
{
scanf("%d", &y);
del(y);
}
if (x == 3)
printf("%d\n", h[1]);
}
}