比赛 |
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;
}