Cod sursa(job #255313)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 8 februarie 2009 23:51:09
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.03 kb
#include<stdio.h>
#define infile "heapuri.in"
#define outfile "heapuri.out"
#define nmax (200*1000+1)
int i[nmax]; //i[j]-retine valoarea celui de-al j-lea element intrat in heap
int p[nmax]; //p[j]-retine pozitia din hip a elementului elementului  i[j]
int h[nmax]; //min-heap-ul (va retine pozitia din i[] ;))
int n; //numarul de elemente din heap
int o; //numarul de operatii

void add(int x, int n)
	{
	int f=n,t=f/2; //fiul si tatal
	while(t&&i[h[t]]>i[x]) //cat timp tatal e mai mare
		{
		h[f]=h[t]; p[h[f]]=f; //coboram tatal peste fiu :>
		f=t; t=f/2; //refacem perechea de tata si fiu
		}
	h[f]=x; p[h[f]]=f; //salvam elementul in heap
	}

void comb(int x, int n)
	{
	int y=h[x]; //salvam pozitia din v a elementului din heap ce trebuie repozitionat
	int t=x,f=2*t; //tatal si fiul
	while(f<=n)
		{
		if(f<n&&i[h[f+1]]<i[h[f]]) f++; //e mai mic al doilea fiu
		if(i[h[f]]<i[y])
			{
			h[t]=h[f]; p[h[t]]=t; //urcam copilul peste tata
			t=f; f=2*t; //refacem tatal si fiu
			}
		else f=n+1; //i-am gasit pozitia...oprim cautarea :P
		}
	h[t]=y; p[h[t]]=t; //pun la pozitia corecta
	}

void delete(int x, int n)
	{
	h[x]=h[n+1]; //copiem ultimul element peste cel pe care il stergem
	p[h[x]]=x; //salvam noua pozitie
	comb(x,n); //refacem heapul
	}
int main()
{
int t,x;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

scanf("%d\n",&o); //citim numarul de operatii pe care le vom face ;))
while(o--) //cat timp avem de facut operatii
	{
	scanf("%d",&t); //citim tipul operatiei ;))
	if(t==1) //avem de inserat un element in heap
		{
		scanf("%d",&x); i[++i[0]]=x; //salvam ca am intrat pe x :P
		add(i[0],++n); //adaugam elementul i[i[0]] in heap
		}
	else if(t==2) //trebuie sa stergem un element din heap ;))
		{
		scanf("%d",&x); //numarul de ordine din intrari al elementului ce trebuie sters ;))
		delete(p[x],--n); //stergem al x-lea element intrat din heap
		}
	else if(t==3) printf("%d\n",i[h[1]]); //afisem cea mai mica valoare din heap
	}

fclose(stdin);
fclose(stdout);
return 0;
}