Cod sursa(job #594828)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 9 iunie 2011 19:18:56
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>

struct heap {
	int val,nr;
};

heap h[200001];
int nr,n;

void swap(heap &a, heap &b) {
	heap c=a;
	a=b;
	b=c;
}

void hurc(int p) {
	if(p!=1 && h[p].val<h[p>>1].val) {
		swap(h[p],h[p>>1]);
		hurc(p>>1);
	}
}
void hcob(int p) {
	if(2*p+1<=n && h[2*p+1].val<h[2*p].val && h[2*p+1].val<h[p].val) {
		swap(h[2*p+1],h[p]);
		hcob(2*p+1);
	}
	else if(2*p<=n && h[2*p].val<h[p].val) {
		swap(h[2*p],h[p]);
		hcob(2*p);
	}
}

inline void hpush(int y,int nrr) {
	h[++n].val=y; h[n].nr=nrr;
	hurc(n);
}

void hel(int p) {
	int i;
	for(i=1;i<=n;++i) {
		if(h[i].nr==p) {
			swap(h[i],h[n--]);
			hcob(i);
		}
	}
}

int main() {
	int i,a,b,c=0;
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d",&nr);
	for(i=1;i<=nr;++i) {
		scanf("%d",&a);
		if(a==1) {
			scanf("%d",&b);
			hpush(b,++c);
		}
		if(a==2) {
			scanf("%d",&b);
			hel(b);
		}
		if(a==3)
			printf("%d\n",h[1]);
	}
	return 0;
}