Cod sursa(job #744792)

Utilizator gabrielvGabriel Vanca gabrielv Data 9 mai 2012 17:43:42
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include<cstdio>
#include<vector>

using namespace std;

vector < pair < int , int > > H;
int k,n,x,y;
inline int father(int i)
{
	return i>>1;
}
inline int left_son(int i)
{
	return i<<1;
}
inline int right_son(int i)
{
	return (i<<1)+1;
}
void percolate(int i)
{
	int aux,auxs;
	aux=H[i].first;
	auxs=H[i].second;
	while((i>1)&&(aux<H[father(i)].first))
	{
		H[i].first=H[father(i)].first;
		H[i].second=H[father(i)].second;
		i=father(i);
	}
	H[i].first=aux;
	H[i].second=auxs;
}
void sift(int i)
{
	int son,aux;
	do
	{
		son=-1;
		if(left_son(i)<H.size())
		{
			son=left_son(i);
			if((right_son(i)<H.size())&&(H[right_son(i)].first < H[left_son(i)].first))
				son=right_son(i);
			if(H[son].first>=H[i].first)
				son=-1;
		}
		if(son!=-1)
		{
			aux=H[i].first;
			H[i].first=H[son].first;
			H[son].first=aux;

			aux=H[i].second;
			H[i].second=H[son].second;
			H[son].second=aux;
			
			i=son;
		}
	}while(son!=-1);
}
void insert()
{
	H.push_back(make_pair(y,++k));
	percolate(k);
}
void cut(int i)
{
	H[i].first=H[H.size()-1].first;
	H[i].second=H[H.size()-1].second;
	vector < pair < int , int > > ::iterator it = H.begin() + H.size()-1;
	H.erase(it);
	if((i>1)&&(H[i].first<H[father(i)].first))
		percolate(i);
	else
		sift(i);
}
int search(int val)
{
	/*int left,right,mid;
	left=0;
	right=H.size()-1;
	while(left<=right)
	{
		mid=left+(right-left)/2;
		if(H[mid].second==val)
			return mid;
		else
			if(H[mid].second<val)
				left=mid+1;
			else
				right=mid-1;
	}
	return -1;*/
	int i;
	for(i=1;i<H.size();i++)
		if(H[i].second==val)
			return i;
	return -1;
}
int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	H.push_back(make_pair(0,0));
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&x);
		if(x!=3)
			scanf("%d",&y);

		if(x==1)
			insert();
		else
			if(x==2)
				cut(search(y));
			else
				printf("%d\n",H[1].first);
	}
	return 0;
}