Pagini recente » Cod sursa (job #2496413) | Cod sursa (job #1492037)
#include <iostream>
using namespace std;
int heap[200005], x_posInHeap[200005], posInHeap_x[200005], i, n, nmb, size = 0, x = 0;
void push_up(int pos)
{
int new_pos = pos, temp;
if ((pos - 1) / 2 >= 0 && heap[(pos - 1) / 2] > heap[new_pos])
{
new_pos = (pos - 1) / 2;
temp = x_posInHeap[posInHeap_x[new_pos]];
x_posInHeap[posInHeap_x[new_pos]] = x_posInHeap[posInHeap_x[pos]];
x_posInHeap[posInHeap_x[pos]] = temp;
temp = posInHeap_x[pos];
posInHeap_x[pos] = posInHeap_x[new_pos];
posInHeap_x[new_pos] = temp;
temp = heap[pos];
heap[pos] = heap[new_pos];
heap[new_pos] = temp;
push_up(new_pos);
}
}
void push_down(int pos)
{
int new_pos = pos, temp;
if (pos * 2 + 1 < size && heap[pos * 2 + 1] < heap[new_pos]) new_pos = pos * 2 + 1;
if (pos * 2 + 2 < size && heap[pos * 2 + 2] < heap[new_pos]) new_pos = pos * 2 + 2;
if (pos != new_pos)
{
temp = x_posInHeap[posInHeap_x[new_pos]];
x_posInHeap[posInHeap_x[new_pos]] = x_posInHeap[posInHeap_x[pos]];
x_posInHeap[posInHeap_x[pos]] = temp;
temp = posInHeap_x[pos];
posInHeap_x[pos] = posInHeap_x[new_pos];
posInHeap_x[new_pos] = temp;
temp = heap[pos];
heap[pos] = heap[new_pos];
heap[new_pos] = temp;
push_down(new_pos);
}
}
void insert(int number)
{
heap[size] = number;
posInHeap_x[size] = x;
x_posInHeap[x++] = size;
push_up(size++);
}
void remove(int order)
{
int to_overwrite, to_write;
heap[x_posInHeap[order]] = heap[size - 1];
heap[size - 1] = -1;
to_write = posInHeap_x[size - 1];
to_overwrite = posInHeap_x[x_posInHeap[order]];
posInHeap_x[x_posInHeap[order]] = posInHeap_x[size - 1];
posInHeap_x[size - 1] = -1;
x_posInHeap[to_write] = x_posInHeap[to_overwrite];
x_posInHeap[to_overwrite] = -1;
size--;
push_down(x_posInHeap[to_write]);
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
cin >> n;
memset(heap, -1, n * 4);
memset(x_posInHeap, -1, n * 4);
memset(posInHeap_x, -1, n * 4);
for (i = 0; i < n; ++i)
{
cin >> nmb;
switch (nmb)
{
case 1: cin >> nmb; insert(nmb); break;
case 2: cin >> nmb; remove(nmb - 1); break;
case 3: cout << heap[0] << "\n"; break;
}
}
}