Cod sursa(job #1075790)

Utilizator danny794Dan Danaila danny794 Data 9 ianuarie 2014 16:17:49
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>

using namespace std;

const int NMAX = 200005;
int N, H, A;
int heap[NMAX], array[NMAX];

inline void swap(int a, int b) {
	int aux = heap[a];
	heap[a] = heap[b];
	heap[b] = aux;
}

inline void insert(int elem) {
	array[++A] = elem;
	heap[++H] = elem;
	int index = H, aux = heap[index];
	while( index > 1 && aux < heap[index >> 1]) {
		swap(index, index >> 1);
		index >>= 1;
	}
}

inline void remove(int elem) {
	for(int index = 1; index <= H; index++)
		if( heap[index] == elem ) {
			swap(index, H--);
			while( true ) {
				int min = index;

				if( (index << 1) <= H && heap[index << 1] < heap[min] )
					min = index << 1;
				if( ((index << 1) + 1) <= H && heap[(index << 1) + 1] < heap[min] )
					min = (index << 1) + 1;

				if( index != min ) {
					swap(index, min);
					index = min;
				} else
					break;
			}
			break;
		}
}

int main() {
	freopen( "heapuri.in", "r", stdin );
	freopen( "heapuri.out", "w", stdout );
	scanf("%i", &N);
	int type, n;
	for(int i = 0; i < N; i++) {
		scanf("%i", &type);
		switch(type) {
		case(1): scanf("%i", &n); insert(n); break;
		case(2): scanf("%i", &n); remove(array[n]); break;
		case(3): printf("%i\n", heap[1]); break;
		}
	}
	return 0;
}