Cod sursa(job #758521)

Utilizator taigi100Cazacu Robert taigi100 Data 15 iunie 2012 21:15:27
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
using namespace std;
int v[200005],poz[200005],el;
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++;
	v[el]=val;
	poz[el]=el;
	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;
	FILE *f=fopen("heapuri.in","r");
	FILE *g=fopen("heapuri.out","w");
	fscanf(f,"%d",&n);
	for(int i=1;i<=n;i++)
	{
		fscanf(f,"%d",&x);
		if(x==1)
		{
			fscanf(f,"%d",&y);
			add(y);
		}
		else if(x==2)
		{
			fscanf(f,"%d",&y);
			del(y);
		}
		else
			fprintf(g,"%d\n",v[1]);
	}
}