#include<iostream>
#include<Cstdio>
using namespace std;
template <class T>
class MinHeap{
private:
T *heapArray;
int CurrentSize;
int MaxSize;
void swap(int pos_x,int pos_y) //交换
{
T temp;
temp=heapArray[pos_x];
heapArray[pos_x]=heapArray[pos_y];
heapArray[pos_y]=temp;
}
void BuildHeap();
public:
MinHeap(const int n);
bool isEmpty();
bool isLeaf(int pos) const;
int left(int pos) const;
int right(int pos) const;
int Parent(int pos) const;
bool Remove(int pos,T &node);
bool Remove(int pos);
bool Insert(const T value);
T& RemoveTop();
void ShiftUp(int position);
void ShiftDown(int left);
void display()
{
cout << "MaxSize:" <<MaxSize<<endl;
cout << "CurrentSize:" <<CurrentSize<<endl;
for(int i=0;i<CurrentSize;i++)
{
cout << heapArray[i] << " ";
}
cout <<endl;
}
};
template <class T>
MinHeap<T>::MinHeap(const int n)
{
if(n<0)return;
MaxSize=n;
CurrentSize=0;
heapArray=new T[MaxSize];
BuildHeap();
}
template <class T>
bool MinHeap<T>::isLeaf(int pos) const{ //判断是否为叶子节点
return (pos>=CurrentSize/2)&&(pos<CurrentSize);
}
template <class T>
void MinHeap<T>::BuildHeap(){ //建堆
for(int i=CurrentSize/2-1;i>=0;i--)
{
ShiftDown(i);
}
}
template <class T>
int MinHeap<T>::left(int pos) const
{
return 2*pos+1;
}
template <class T>
int MinHeap<T>::right(int pos) const
{
return 2*pos+2;
}
template <class T>
int MinHeap<T>::Parent(int pos) const
{
return ((pos-1)/2);
}
template <class T>
bool MinHeap<T>::Insert(const T value) //新结点插入数组尾部并做一次上浮操作
{
if(CurrentSize==MaxSize)
return false;
heapArray[CurrentSize]=value;
ShiftUp(CurrentSize);
CurrentSize++;
return true;
}
template <class T>
T& MinHeap<T>::RemoveTop() //弹出最小值
{
if(CurrentSize==0)
{
cout << "Heap is empty" <<endl;
return heapArray[CurrentSize-1];
}
else
{
swap(0,--CurrentSize);
if(CurrentSize>1)
ShiftDown(0);
return heapArray[CurrentSize];
}
}
template <class T>
bool MinHeap<T>::Remove(int pos,T &node) //删除下标为pos的结点,将最后一个元素值与之替换
{
if((pos<0)||(pos>=CurrentSize))return false;
node=heapArray[pos];
heapArray[pos]=heapArray[--CurrentSize];
if(heapArray[Parent(pos)]>heapArray[pos]) //根据替换后的删除节点选择上浮或下沉
ShiftUp(pos);
else ShiftDown(pos);
return true;
}
template <class T>
void MinHeap<T>::ShiftUp(int pos) //上浮
{
int temppos=pos; //初始化为上浮结点位置
T temp=heapArray[temppos]; //上浮结点值
while((temppos>0)&&(heapArray[Parent(temppos)]>temp)) //当前结点的父节点大于上浮结点
{
heapArray[temppos]=heapArray[Parent(temppos)];
temppos=Parent(temppos);
}
heapArray[temppos]=temp;
}
template <class T>
void MinHeap<T>::ShiftDown(int l) //下沉
{
//从左子树下沉
int i=l;
int j=left(i); //当前结点初始化为左子树
T temp=heapArray[i];
while(j<CurrentSize)
{
if((j<CurrentSize-1)&&(heapArray[j]>heapArray[j+1]))
{
//存在右子树且右结点小于左结点,指向右结点
j++;
}
if(temp>heapArray[j]) //下沉节点值大于当前节点
{
heapArray[i]=heapArray[j]; //下沉
i=j;
j=left(j);
}
else break;
}
heapArray[i]=temp;
}
int main()
{
MinHeap<int> a(1000);
int n;
int s,p;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>s;
a.Insert(s);
}
a.display();
cin>>s;
a.Remove(s,p);
cout << "remove No." << s <<" value is "<<p<<endl;
a.display();
cout << "top:" <<a.RemoveTop() <<" removed" <<endl;
a.display();
}
}