Cod sursa(job #758581)

Utilizator soriynSorin Rita soriyn Data 16 iunie 2012 00:31:32
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<stdio.h>
#include<cstring>
using namespace std;
int v[200005],poz[200005],el,elr;
void swap(int a,int b)
{
	int aux;
	aux=v[a];
	v[a]=v[b];
	v[b]=aux;
	aux=poz[a];
	poz[a]=poz[b];
	poz[b]=aux;
}
void Act(int loc)
{
	while(v[loc/2]>v[loc] && loc/2>0)
	{
		swap(loc/2,loc);
		loc=loc>>2;
	}
}
void add(int val)
{
	el++;
	elr++;
	v[el]=val;
	poz[el]=elr;
	Act(el);
}
void down(int loc)
{
	int s=loc*2,d=loc*2+1,fk=loc;
	if(s<=el && v[s]<v[fk])
		fk=s;
	if(d<=el && v[d]<v[fk])
		fk=d;
	if(fk!=loc)
	{
		swap(fk,loc);
	     down(fk);
	}
}
void del(int val)
{
	int i;
	for(i=1;i<=el;i++)
		if(poz[i]==val)
	         break;
	v[i]=v[el];
	poz[i]=poz[el];
	el--;
	Act(i);
	down(i);
}
int main ( )
{
	int n,x,y;
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d\n",&n);
	char buff[10];
	for(int i=1;i<=n;i++)
	{
		fgets(buff,10,stdin);
		x=buff[0]-'0';
		y=0;
		int len=strlen(buff);
		if(x==1)
		{
			for(int i=2;i<len;i++)
				if(buff[i]>='0' && buff[i]<='9')
				y=y*10+(buff[i]-'0');
				else break;
			add(y);
		}
		else if(x==2)
		{
			for(int i=2;i<len;i++)
				if(buff[i]>='0' && buff[i]<='9')
				y=y*10+(buff[i]-'0');
				else break;
			del(y);
		}
		else
			printf("%d\n",v[1]);
	}
}