Pagini recente » Cod sursa (job #601180) | Cod sursa (job #1886276) | Cod sursa (job #3255829) | Cod sursa (job #3262472) | Cod sursa (job #870472)
Cod sursa(job #870472)
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f = fopen ("heapuri.in","r");
FILE *g = fopen ("heapuri.out","w");
const int MAX_N = 200005;
int N, m, A[MAX_N], Heap[MAX_N], poz[MAX_N], cnt;
void sift(int K)
{
int son;
do {
son = 0;
if (2 * K <= N) {
son = 2 * K;
if (2 * K + 1 <= N && A[Heap[2 * K + 1]] < A[Heap[son]])
son = 2 * K + 1;
}
if (A[Heap[son]] > A[Heap[son / 2]])
son = 0;
if (son) {
swap(poz[Heap[K]], poz[Heap[son]]);
swap(Heap[K], Heap[son]);
K = son;
}
} while (son);
}
void percolate(int K)
{
int key = A[Heap[K]];
while (K > 1 && A[Heap[K]] < A[Heap[K / 2]]) {
swap(poz[Heap[K]], poz[Heap[K / 2]]);
swap(Heap[K], Heap[K / 2]);
K = K / 2;
}
A[Heap[K]] = key;
}
void insert()
{
Heap[++N] = N;
poz[N] = N;
percolate(N);
}
void erase(int pos)
{
swap(poz[Heap[pos]], poz[Heap[N]]);
Heap[pos] = Heap[N];
N--;
if (A[Heap[pos]] < A[Heap[pos / 2]])
percolate(pos);
else
sift(pos);
}
int main()
{
int op, a;
fscanf (f, "%d", &m);
while (m--) {
fscanf (f, "%d", &op);
if (op == 1) {
fscanf (f, "%d", &a);
A[++cnt] = a;
insert();
} else if (op == 2) {
fscanf (f, "%d", &a);
erase(poz[a]);
} else
fprintf (g, "%d\n", A[Heap[1]]);
}
return 0;
}