#define HEAP_MAX 40001
#define rint register int
int heap[HEAP_MAX];
int curSize;
void heap_insert(int data)
{
heap[++curSize] = data;
rint pos = curSize;
rint parent = pos >> 1;
while (parent)
{
if (heap[parent] < heap[pos])
{
int tmp = heap[pos];
heap[pos] = heap[parent];
heap[parent] = tmp;
pos = parent;
parent = parent >> 1;
}
else
break;
}
}
bool heap_delete(int &data)
{
if (curSize == 0)
return false;
data = heap[1];
heap[1] = heap[curSize--];
rint parent_index = 1;
rint max_index;
while (1)
{
rint left = parent_index << 1;
rint right = left + 1;
if (left > curSize)
break;
max_index = parent_index;
if (heap[parent_index] < heap[left])
max_index = left;
if (right <= curSize && heap[max_index] < heap[right])
max_index = right;
if (max_index != parent_index)
{
int tmp = heap[parent_index];
heap[parent_index] = heap[max_index];
heap[max_index] = tmp;
parent_index = max_index;
}
else
break;
}
}
void Init(int N, int num[])
{
curSize = 0;
for (rint i = 0; i < N; i++)
heap_insert(num[i]);
}
void Push(int num)
{
heap_insert(num);
}
int Pop()
{
int ret = 0;
heap_delete(ret);
return ret;
}
网友评论