Cod sursa(job #358158)

Utilizator allynaAlina S allyna Data 21 octombrie 2009 23:41:55
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<stdio.h>
#define D 200010
using namespace std;

int n,a[D],heap[D],v[D],num,k,a1,a2,i;

void sw(int x,int y)
{ int aux;
  aux=heap[x];
  heap[x]=heap[y];
  heap[y]=aux;
  v[heap[x]]=x;v[heap[y]]=y;
}
void baga(int x,int y)
{ int i;
	heap[++k]=y;
	v[num]=k;
	i=k;
	while((a[heap[i/2]]>a[heap[i]])&&(i/2))
		{
			sw(i,i/2);
			i=i/2;
		}
}
void del(int x)
{int i,j,ok=1;
	sw(x, k);
	i=x;
	k--;
	j=i*2;
	while(ok)
	{
		j=i*2;
		if(j>k) return;
		if((k>=j+1) && (a[heap[j+1]]<a[heap[j]])) j++;
		if(a[heap[j]]>=a[heap[i]]) return;
		sw(j,i);
		i=j; 
	}
}
int main()
{
   freopen("heapuri.in", "r",stdin);
   freopen("heapuri.out", "w",stdout);
	scanf("%d",&n);
	num=0;
	for(i=1;i<=n;i++)
		{
		scanf("%d",&a1);
		if(a1==1)
			{
				scanf("%d",&a2);
				a[++num]=a2;
				baga(a2,num);
			}  
		  else 
		  if(a1==2)
			  { 
  	  		  scanf("%d",&a2);
			   del(v[a2]);
			  }
		    else 
			printf("%d\n",a[heap[1]]);
		}
	return 0;




}