Cod sursa(job #580657)

Utilizator tvladTataranu Vlad tvlad Data 13 aprilie 2011 12:39:31
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>

const int MAX_N = 200001;

int n, vSize, heapSize;
int v[MAX_N], heap[MAX_N], pos[MAX_N];

void swap ( int &a, int &b ) {
	a ^= b ^= a ^= b;
}

void insert ( int x ) {
	++heapSize; heap[heapSize] = x;
	for (int k = heapSize; k > 1 && v[heap[k/2]] > v[heap[k]]; k = k/2) {
		swap(heap[k/2], heap[k]);
		pos[heap[k]] = k;
	}
}

void pop() {
	swap(heap[1], heap[heapSize]);
	pos[heap[1]] = 1;
	--heapSize;
	for (int k = 1; k <= heapSize; ) {
		if (k*2 <= heapSize && v[heap[k]] > v[heap[k*2]]) {
			swap(heap[k], heap[k*2]);
			pos[heap[k]] = k;
			pos[heap[k*2]] = k*2;
			k = k*2;
		} else
		if (k*2+1 <= heapSize && v[heap[k]] > v[heap[k*2+1]]) {
			swap(heap[k], heap[k*2+1]);
			pos[heap[k]] = k;
			pos[heap[k*2+1]] = k*2+1;
			k = k*2+1;
		} else {
			break;
		}
	}
}

void pop ( int x ) {
	for (int k = pos[x]; k > 1; k = k/2) {
		swap(heap[k/2], heap[k]);
		pos[heap[k]] = k;
	}
	pop();
}

int main() {
	freopen("heapuri.in","rt",stdin);
	freopen("heapuri.out","wt",stdout);
	scanf("%d",&n);
	for (int i = 0, op, x; i < n; ++i) {
		scanf("%d",&op);
		if (op == 1) {
			scanf("%d",&v[vSize]); ++vSize;
			insert(vSize-1);
		} else
		if (op == 2) {
			scanf("%d",&x);
			--x;
			pop(x);
		} else
		if (op == 3) {
			printf("%d\n",v[heap[1]]);
		}
	}
	return 0;
}