Cod sursa(job #758582)

Utilizator soriynSorin Rita soriyn Data 16 iunie 2012 00:32:32
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>
#include<algorithm>
#define maxn 200010

using namespace std;
int m,op,x,nr,N;
int Heap[maxn],A[maxn],Pos[maxn];

inline int father(int nod)
{
	return nod/2;
}

inline int left_son(int nod)
{
	return 2*nod;
}

inline int right_son(int nod)
{
	return 2*nod+1;
}
void upheap(int k)
{
	
	while(k/2 && A[Heap[k/2]]>A[Heap[k]])
	{
		swap(Heap[k/2],Heap[k]);
		swap(Pos[Heap[k/2]],Pos[Heap[k]]);
		k/=2;
	}
}
void downheap(int k)
{
	int son;
	do
	{
		son=0;
		if(left_son(k)<=N)
			son=left_son(k);
		if(right_son(k)<=N && ( A[Heap[left_son(k)]]>A[Heap[right_son(k)]]))
			son=right_son(k);
		if(A[Heap[son]]>A[Heap[k]])
			son=0;
		
        if(son)
		{
		 
		  swap(Heap[son],Heap[k]);
		  swap(Pos[Heap[son]],Pos[Heap[k]]);
		   k=son;
		}
		
	}
	while(son);
}



int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	
	
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&op);
	  if(op<3)
		{
			scanf("%d",&x);

		if(op==1)
		{
			nr++,N++;
			A[nr]=x;
			Heap[N]=nr;
			Pos[nr]=N;
			upheap(N);
		}
		if(op==2)
		{
			A[x]=-1;
			upheap(Pos[x]);
			Pos[Heap[1]] = 0;
			Heap[1] = Heap[N--];
            Pos[Heap[1]] = 1;
            if (N>1) downheap(1);
		}
	  }
     if (op == 3) printf("%d\n", A[Heap[1]]);
			
			
			
		}
}