Cod sursa(job #744501)

Utilizator gabrielvGabriel Vanca gabrielv Data 8 mai 2012 20:58:12
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 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&&(H[i].first>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;
		}
	}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() + i;
	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 main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	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[0].first);
	}
	return 0;
}