Cod sursa(job #389996)

Utilizator mihaimoldovanMihai Moldovan mihaimoldovan Data 2 februarie 2010 18:07:41
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<iostream>
using namespace std;
#define nr 200000
int n,m,h[nr],v[nr],poz[nr];
void adauga(int x)
{
	v[++n]=x;//il adaug pe x in vector
	h[++m]=n;//pe n il adaug in heap
	poz[n]=m;//tin minte pozitia lui m
	int pp=0,i=m;//presupun ca nu e heap
	for(;!pp&&i>1;)//daca pp==0 si i>1
		if(v[h[i/2]]<v[h[i]])//daca parintele e mai mic atunci e heap
			pp=1;
		else//daca nu atunci trebuie interschimbate valorile
		{
			int aux=h[i];//interschimb valorile
			h[i]=h[i/2];
			h[i/2]=aux;
			poz[h[i]]=i;//actualizez pozitiile
			poz[h[i/2]]=i/2;
			i/=2;//trec mai departe
		}
}
void sterge(int x)
{
	int i=poz[x],k;//la i ii dau pozitia lui x
	int pp=0;//presupun ca nu e heap
	h[i]=h[m--];
	poz[h[i]]=i;//nu imi merge forul
	for(;!pp&&i*2<=m;)//daca pp==0 si i*2<n
	{
		k=2*i;
		if(k+1<=m&&v[h[k]]>v[h[k+1]])//dintre cei doi fii ai lui i il aleg pe cel mai mic
			++k;
		if(v[h[i]]<v[h[k]])//daca parintele e mai mic atunci e heap
			pp=1;
		else//daca nu e heap interschimb valorile
		{
			int aux=h[i];
			h[i]=h[k];
			h[k]=aux;
			poz[h[i]]=i;
			poz[h[k]]=k;
			i=k;//trec mai departe
		}
	}
	for(int i=1;i<=m;i++)
		cout<<h[i]<<" ";
	cout<<endl;
}
int main()
{
	int z,op,x;
	ifstream fin("heapuri.in");
	fin>>z;
	FILE *fout=fopen("heapuri.out","w");
	for(;z;--z)
	{
		fin>>op;
		if(op==3)fprintf(fout,"%d\n",v[h[1]]);	
		else
		{
			fin>>x;
			if(op==1)adauga(x);
			else sterge(x);
		}
	}
	fclose(fout);
	system("pause");
	return 0;
}