#include<iostream>
#include<cstdio>
using namespace std;
int heap[1000010];
int tot;
#define lson ((rt)<<1)//注意加外括号
#define rson (((rt)<<1)|1)
void query(int rt)
{
heap[1]=heap[--tot];
while(1)
{
if(lson<=tot || rson<=tot )
{
if(lson<=tot && heap[lson]>heap[rson] )
{
if(lson<=tot && heap[lson]>heap[rt])
{
swap(heap[lson],heap[rt]);
rt=lson;
}
else
break;
}
else
{
if(rson<=tot && heap[rson]>heap[rt])
{
swap(heap[rson],heap[rt]);
rt=rson;
}
else
break;
}
}
else
break;
}
}
void add(int rt,int val)
{
int m;
heap[tot++]=val;
while(rt!=1)
{
m=rt>>1;
if(heap[rt]>heap[m])
{
swap(heap[rt],heap[m]);
rt=m;
}
else
break;
}
}
int main()
{
int t;
scanf("%d",&t);
char ch[2];
tot=1;
for(int i=0;i<t;i++)
{
scanf("%s",ch);
int tmp;
if(ch[0]=='Q')//询问最大值并删除最大值
{
if(tot<=1)
{
printf("No solution\n");
continue;
}
else
printf("%d\n",heap[1]);
query(1);
}
else if(ch[0]=='I')//添加新的点
{
scanf("%d",&tmp);
add(tot,tmp);
}
}
return 0;
}
手写最大堆
最新推荐文章于 2024-06-22 20:37:45 发布