Cod sursa(job #301545)

Utilizator hazegirlCatalina Predoi hazegirl Data 8 aprilie 2009 11:47:11
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
//heapuri
#include<fstream.h>

long v[200001],ord[200001],aux,i,n,out;

void actualizare(int m)
{int fiu=m,tata=m/2;
while(tata && v[tata]>v[fiu])
	{aux=v[fiu];
	v[fiu]=v[tata];
	v[tata]=aux;
	aux=ord[fiu];
	ord[fiu]=ord[tata];
	ord[tata]=aux;
	fiu=tata;
	tata=fiu/2;
	}
}
void stergere(int m)
{int tata=0,fiu;
for(int i=1;i<=v[0]&&!tata;++i)
	if(ord[i]==m) tata=i;
while(tata<v[0])
	{if(v[2*tata] && v[2*tata+1])
		{fiu=(v[2*tata]<v[2*tata+1]? (2*tata):(2*tata+1));
		 v[tata]=v[fiu];
		 ord[tata]=ord[fiu];
		 tata=fiu;
		 }
		else if(v[2*tata])
			{fiu=2*tata;
			 v[tata]=v[fiu];
			 ord[tata]=ord[fiu];
			 tata=fiu;
			}

	}
v[0]--;

}

int main()
{ifstream f("heapuri.in");
ofstream g("heapuri.out");
f>>n;
long op,t=0;
for(i=1;i<=n;++i)
	{f>>op;
	if(op==1)
		{f>>v[++v[0]];
		ord[v[0]]=++t;
		actualizare(v[0]);
		}
	else if(op==2)
		{f>>out;
		stergere(out);
		}
	else if(op==3)
		g<<v[1]<<'\n';

	}
f.close();
g.close();
return 0;
}