比赛 201001-line 评测结果 C
题目名称 可合并堆 最终得分 0
用户昵称 Oo湼鞶oO 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-01-18 21:35:01
显示代码纯文本
#include <fstream>

using namespace std;

short n;

int main()
{
	short s[n][n+1]={{0}};
	bool f[n+1]={false};
	ifstream fin("uheap.in");
	ofstream fout("uheap.out");
	fin>>n;
	short i,x,y,z,j,k,t;
	for (i=0; i<n; i++)
	{
		fin>>x;
		if (x==1)
		{
			fin>>y;
			f[y]=true;
			fout<<0<<endl;
		}
		else if(x==2)
		{
			fin>>y;
			if (f[y]==false)
			{
				fout<<"insert error!\n";
				fin>>j;
			}
			else
			{
				fin>>s[y][++s[y][0]];
			    for (j=s[y][0]; j>1; j/=2)
					if (s[y][j]<s[y][j/2])
					{
						k=s[y][j];
						s[y][j]=s[y][j/2];
						s[y][j/2]=k;
					}				
					else
						break;
				fout<<0<<endl;
			}
		}
		else if (x==3)
		{
			fin>>y;
			if ((f[y]==false)||(s[y][0]==0))
				fout<<"extract error!\n";
			else
			{
				fout<<s[y][1]<<endl;
				s[y][1]=s[y][s[y][0]--];
				j=1;
				while (((j*2<=s[y][0])&&(s[y][j]>s[y][j*2]))||((j*2+1<=s[y][0])&&(s[y][j]>s[y][j*2])))
					if ((s[y][j*2]<s[y][j*2+1])||(j*2+1>s[y][0]))
					{
						k=s[y][j];
						s[y][j]=s[y][j*2];
						s[y][j*2]=k;
						j*=2;
					}
					else
					{
						k=s[y][j];
						s[y][j]=s[y][j*2+1];
						s[y][j*2+1]=k;
						j=j*2+1;
					}
			}
		}
		else
		{
			fin>>y; fin>>z;
			if ((f[y]==false)||(f[z]==false))
				fout<<"union error!\n";
			else
			{
				for (j=1; j<=s[z][0]; j++)
				{
					s[y][++s[y][0]]=s[z][j];
					for (k=s[y][0]; k>1; k/=2)
						if (s[y][k]<s[y][k/2])
						{
							t=s[y][k];
							s[y][k]=s[y][k/2];
							s[y][k/2]=t;
						}
						else
							break;
				}
				s[z][0]=0;
			}
			fout<<0<<endl;
		}
	}
	
	fin.close();
	fout.close();
	return 0;
}