Cod sursa(job #1448258)

Utilizator razvan3895Razvan-Mihai Chitu razvan3895 Data 6 iunie 2015 15:19:16
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <iostream>

using namespace std;

#define swap(a, b)	a = a ^ b; b = a ^ b; a = a ^ b;
#define SIZE	200002

unsigned int heap[SIZE];
unsigned int poz1[SIZE];
unsigned int poz2[SIZE];
unsigned int dim;

void pushUp(int i) {
	while(i > 1 && heap[i] < heap[i / 2]) {
		swap(heap[i], heap[i / 2]);
		swap(poz2[i], poz2[i / 2]);
		poz1[poz2[i]] = i;
		poz1[poz2[i / 2]] = i / 2;
		i = i / 2;
	}
}

void insert(int x, int p) {
	heap[++dim] = x;
	poz1[p] = dim;
	poz2[dim] = p;
	pushUp(dim);
}

void pushDown(int i) {
	while(1) {
		if(i * 2 > dim)
			break;
		if(i * 2 + 1 > dim) {
			if(heap[i] > heap[i * 2]) {
				swap(heap[i], heap[i * 2]);
				swap(poz2[i], poz2[i * 2]);
				poz1[poz2[i]] = i;
				poz1[poz2[i * 2]] = i * 2;
				i = i * 2;
				continue;
			}
			else
				break;
		}
		if(heap[i * 2] < heap[i * 2 + 1]) {
			if(heap[i] > heap[i * 2]) {
				swap(heap[i], heap[i * 2]);
				swap(poz2[i], poz2[i * 2]);
				poz1[poz2[i]] = i;
				poz1[poz2[i * 2]] = i * 2;
				i = i * 2;
				continue;
			}
			else
				break;
		}
		else {
			if(heap[i] > heap[i * 2 + 1]) {
				swap(heap[i], heap[i * 2 + 1]);
				swap(poz2[i], poz2[i * 2 + 1]);
				poz1[poz2[i]] = i;
				poz1[poz2[i * 2 + 1]] = i * 2 + 1;
				i = i * 2 + 1;
				continue;
			}
			else{
				break;
			}
		}
	}
}

void erase(int p) {
	heap[poz1[p]] = heap[dim];
	poz2[poz1[p]] = poz2[dim];
	--dim;
	pushDown(poz1[p]);
}

int minim() {
	return heap[1];
}

int main() {
	unsigned int op1, op2, n, nr = 1;
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	cin >> n;
	for(unsigned int i = 1; i <= n; ++i) {
		cin >> op1;
		if(op1 == 3) {
			cout << minim() << '\n';
			continue;
		}
		cin >> op2;
		if(op1 == 1) {
			insert(op2, nr);
			++nr;
			continue;
		}
		if(op1 == 2) {
			erase(op2);
			continue;
		}
	}
	return 0;
}