Cod sursa(job #1473629)

Utilizator aimrdlAndrei mrdl aimrdl Data 19 august 2015 20:18:46
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>

#define MAX 200005

typedef struct {
	int v; //value
	int n; //nth element added
} HType;

HType h[MAX];
int added[MAX], pos, add;

void swap (int x, int y) {
	added[h[x].n] = y;
	added[h[y].n] = x;
	
	HType temp = h[x];
	h[x] = h[y];
	h[y] = temp;
}

void push (int x) {
	int p = pos;

	h[p].v = x;
	h[p].n = add;
	
	added[add] = p;
	
	++add;
	++pos;
	
	while (p && h[(p-1)/2].v > h[p].v) {
		swap((p-1)/2 , p);
		p = (p-1)/2;
	}
}

void pop (int x) {
	--pos;
	
	int aux = added[x];
	swap(pos, added[x]);
	
	x = aux;
	int ok = 0;
	do {
		int minp = x;
		if ((2*x+1) < pos && h[2*x+1].v < h[x].v) minp = 2*x+1;
		if ((2*x+2) < pos && h[2*x+2].v < h[minp].v) minp = 2*x+2;
		
		if (minp != x) {
			swap(minp, x);
			x = minp;
		} else {
			ok = 1;
		}
	} while (!ok);
	
	int p = aux;
	while (p && h[(p-1)/2].v > h[p].v) {
		swap((p-1)/2 , p);
		p = (p-1)/2;
	}
	
	
}

int main (void) {
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	
	int n;
	scanf("%d", &n);
	
	for (int i = 0; i < n; ++i) {
		int code;
		scanf("%d", &code);
		
		if (code == 3) {
			printf("%d\n", h[0].v);
		} else {
			int x;
			scanf("%d", &x);
			if (code == 1) {
				push(x);
			} else {
				pop(x-1);
			}
		}
		/*
		printf("test: ");
		for (int i = 0; i < pos; ++i) {
			printf("%d ", h[i].v);
		}
		printf("\n");
		*/
	}
	
	return 0;
}