二分ヒープ木
# 目次
完全二分木とは、各葉の深さの差が1以下で、かつ各内部節点が2つの子を持つような木.
1次元配列を使った二分ヒープとして実装できる.
#define left(x) (x * 2)
#define right(x) (x * 2 + 1)
void heapify(vector<int> &vec, int index) {
int l = left(index);
int r = right(index);
int largest;
if (l < vec.size() && vec[l] > vec[index]) largest = l;
else largest = index;
if (r < vec.size() && vec[r] > vec[largest]) largest = r;
bool childLarger = largest != index;
if (childLarger) {
swap(vec[largest], vec[index]);
heapify(vec, largest);
}
}
void buildHeap(vector<int> &vec) {
loopdown(i, vec.size() / 2, 0) heapify(vec, i);
};