Cod sursa(job #870490)

Utilizator vld7Campeanu Vlad vld7 Data 3 februarie 2013 15:02:44
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#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(int val)
{
	A[++cnt] = val;
	Heap[++N] = N;
	poz[cnt] = 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);
			insert(a);
		} else if (op == 2) {
			fscanf (f, "%d", &a);
			erase(poz[a]);
		} else
			fprintf (g, "%d\n", A[Heap[1]]);
	}
	
	return 0;
}