Cod sursa(job #1144660)

Utilizator iarbaCrestez Paul iarba Data 17 martie 2014 13:46:26
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
using namespace std;
int heap[400001],t,c,x,v[200001],poz[200001],k;
void change(int p1, int p2)
{
    int aux;
    aux=poz[heap[p1]];
    poz[heap[p1]]=poz[heap[p2]];
    poz[heap[p2]]=aux;
    aux=heap[p1];
    heap[p1]=heap[p2];
    heap[p2]=aux;
}
void upheap(int p)
{
	if((v[heap[p/2]]==0)||(v[heap[p/2]]>v[heap[p]])){
		change(p,p/2);
		upheap(p/2);
													}
}
void downheap(int p)
{
	if((heap[p*2])||(heap[p*2+1])){
		if((heap[p*2]==0)&&(v[heap[p*2+1]])){change(p,2*p+1);downheap(2*p+1);return;}
		if((v[heap[p*2]])&&(heap[p*2+1]==0)){change(p,2*p);downheap(2*p);return;}
		if(v[heap[p*2]]>v[heap[p*2+1]]){change(p,2*p+1);downheap(2*p+1);return;}
		if(v[heap[p*2]]<=v[heap[p*2+1]]){change(p,2*p);downheap(2*p);return;}
										}
}
int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%ld",&t);v[0]=-1;
	while(t--){
		scanf("%d",&c);
		if(c==1){
			scanf("%ld",&v[++k]);
			heap[k]=k;poz[k]=k;
			upheap(k);
				}
		if(c==2){
			scanf("%ld",&x);
			v[x]=0;downheap(poz[x]);
				}
		if(c==3){
			printf("%ld\n",v[heap[1]]);
				}
			  }
return 0;
}