Cod sursa(job #758587)

Utilizator taigi100Cazacu Robert taigi100 Data 16 iunie 2012 00:53:08
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>
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,d,fk;	while(fk!=loc){
		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);
	   loc=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;
	ifstream f("heapuri.in");
	ofstream g("heapuri.out");
	f>>n;
	for(int i=1;i<=n;i++)
	{
		f>>x;
		if(x==1)
		{
			f>>y;
			add(y);
		}
		else if(x==2)
		{
			f>>y;			del(y);
		}
		else
			g<<v[1]<<'\n';
	}
}