Cod sursa(job #1492037)

Utilizator dimavascan94VascanDumitru dimavascan94 Data 26 septembrie 2015 23:25:05
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#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;
		}
	}
}