Cod sursa(job #633534)

Utilizator dany123Florea Daniel dany123 Data 13 noiembrie 2011 23:07:08
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
//heap cu vector din stl 13.11.2011
//heap[1]=minimul
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int poz[200001],kpoz=0;
vector <int> v;
inline int tata(int nod) { return nod/2; }
inline int fiu_st(int nod) { return nod*2; }
inline int fiu_dr(int nod) { return nod*2+1; }
inline int min () { return v[1]; }
inline void schimba (int &a, int &b) { int cop=a; a=b; b=cop;}
void afisare() {cout<<endl; for (int i=1;i<v.size();i++) cout<<v[i]<<' ';};
void sift (int nod) //muta un nod in jos
{
	int n=v.size()-1;
	int fiu;
	do
	{
		fiu=0; //cautam fiul mai mare/mic, apoi daca acesta e mai mare/mic decat tatal intersch
		if (fiu_st(nod)<=n) 
		{
			fiu=fiu_st(nod);
			if (fiu_dr(nod)<=n && v[fiu_dr(nod)] < v[fiu_st(nod)])//*2
				fiu=fiu_dr(nod);
			if (v[fiu] >= v[nod]) //*
				fiu=0;
		}
		if (fiu)
		{
			schimba(v[nod],v[fiu]);
			nod=fiu; //pt a continua mutarea in jos
		}
	}while (fiu);
}
void percolate(int nod)
{
	int crt=v[nod];
	while ( (nod>1) && (crt < v[tata(nod)]) ) //*2
	{
		schimba (v[nod], v[tata(nod)]);
		nod=tata(nod);
	}
}
/*void create_heap()
{
	for (int i=(v.size()-1)/2;i>0;--i)
		sift(i);
}*/
void sterge(int nod)
{
	v[nod]=v.back();
	v.pop_back();
	if (nod>1 && v[nod] < v[tata(nod)]) //*2
		percolate(nod);
	else 
		sift(nod);
}
void insert(int elem)
{
	poz[++kpoz]=elem;
	v.push_back(elem);
	percolate(v.size()-1);
}
int cauta(int x) //returneaza indicele unde se afla elementul x in heap
{
	for (int i=1;i<v.size();i++)
		if (v[i]==x)
			return i;
	//if shit happens:
	cout<<"\nelementul nu se afla in vector\n";
	return 0;
}
int main ()
{
	int n;
	ifstream fin("heapuri.in");
	ofstream fout("heapuri.out");
	fin>>n;
	v.push_back(0);//ca sa inceapa de la 1
	int x,y;
	for (int i=1;i<=n;i++)
	{	
		fin>>x;
		if (x==1) { fin>>y; insert(y);}
		else if (x==2) { fin>>y; sterge(cauta(poz[y])); }
		else if (x==3) fout<<min()<<'\n';
	}
	fin.close(); fout.close();
	return 0;
}