Cod sursa(job #345362)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 2 septembrie 2009 18:01:49
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>
#define Nmax 200005

FILE *fin=fopen("heapuri.in","r"),
	*fout=fopen("heapuri.out","w");

int N,A[Nmax],poz[Nmax],heap[Nmax],cnt,Nh;

void swap(int i,int j)
{
	heap[i]^=heap[j]^=heap[i]^=heap[j];
	poz[heap[i]]=i;poz[heap[j]]=j;
}

void add(int x)
{
	heap[++Nh]=x;
	poz[cnt]=Nh;
	int i=Nh;
	while(i/2 && A[heap[i/2]]>A[heap[i]])
	{
		swap(i,i/2);
		i/=2;
	}

}

void remove(int x)
{
	swap(x,Nh);
	Nh--;
	int i=x,j;
	while(1)
	{
		j=i*2;
		if(j>Nh) return;
		if(j+1<=Nh && A[heap[j+1]]<A[heap[j]]) ++j;
		if(A[heap[j]]>=A[heap[i]]) return;
		swap(j,i);
		i=j;
	}
}

int main()
{
	fscanf(fin,"%d",&N);
	for(int i=1;i<=N;i++)
	{
		int x,y;
		fscanf(fin,"%d",&x);
		if(x==1)
		{
			fscanf(fin,"%d",&y);
			A[++cnt]=y;
			add(cnt);
		}
		else if(x==2)
			{
				fscanf(fin,"%d",&y);
				remove(poz[y]);
			}
		else fprintf(fout,"%d\n",A[heap[1]]);

	}
	return 0;
}