Pagini recente » Cod sursa (job #1329062) | Cod sursa (job #2297552) | Cod sursa (job #3193098) | Cod sursa (job #1256889) | Cod sursa (job #652641)
Cod sursa(job #652641)
#include <stdio.h>
#include <assert.h>
#define manrn 200010
int n, L, m;
int A[manrn], heap[manrn], poz[manrn];
void push(int nr)
{
int aunr;
while (nr/2 && A[heap[nr]]<A[heap[nr/2]])
{
aunr = heap[nr];
heap[nr] = heap[nr/2];
heap[nr/2] = aunr;
poz[heap[nr]] = nr;
poz[heap[nr/2]] = nr/2;
nr /= 2;
}
}
void pop(int nr)
{
int aunr, y = 0;
while (nr != y)
{
y = nr;
if (y*2<=L && A[heap[nr]]>A[heap[y*2]]) nr = y*2;
if (y*2+1<=L && A[heap[nr]]>A[heap[y*2+1]]) nr = y*2+1;
aunr = heap[nr];
heap[nr] = heap[y];
heap[y] = aunr;
poz[heap[nr]] = nr;
poz[heap[y]] = y;
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, nr, op;
scanf("%d ", &m);
for (i=1; i<=m; i++)
{
scanf("%d ", &op);
if (op < 3) scanf("%d ", &nr);
if (op == 1)
{
L++, n++;
A[n] = nr;
heap[L] = n;
poz[n] = L;
push(L);
}
if (op == 2)
{
A[nr] = -1;
assert(poz[nr] != 0);
assert(1<=nr && nr<=n);
push(poz[nr]);
poz[heap[1]] = 0;
heap[1] = heap[L--];
poz[heap[1]] = 1;
if (L>1) pop(1);
}
if (op == 3) printf("%d\n", A[heap[1]]);
}
return 0;}