Cod sursa(job #580737)

Utilizator tvladTataranu Vlad tvlad Data 13 aprilie 2011 14:03:14
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <cassert>

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;
	pos[heap[heapSize]] = heapSize;
	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;
		pos[heap[k/2]] = k/2;
	}
}

void pop() {
	swap(heap[1], heap[heapSize]);
	pos[heap[1]] = 1;
	--heapSize;
	for (int k = 1; k <= heapSize; ) {
		int a = 0x3f3f3f3f, b = 0x3f3f3f3f;
		if (k*2 <= heapSize) a = v[heap[k*2]];
		if (k*2+1 <= heapSize) b = v[heap[k*2+1]];
		if (a <= b && a < v[heap[k]]) {
			swap(heap[k], heap[k*2]);
			pos[heap[k]] = k;
			pos[heap[k*2]] = k*2;
			k = k*2;
		} else
		if (b < a && b < v[heap[k]]) {
			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;
		pos[heap[k/2]] = k/2;
	}
	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",&x);
			v[vSize] = x; ++vSize;
			insert(vSize-1);
		} else
		if (op == 2) {
			scanf("%d",&x);
			--x;
			pop(x);
		} else
		if (op == 3) {
			x = 0;
			printf("%d\n",v[heap[1]]);
		}
	}
	return 0;
}