#include <algorithm>
#include <limits>
#include "heap.h"
int heapSize;
//Восстановление свойства кучи
void heapify(int a[], int i){
int left = 2*i;
int right = 2*i + 1;
//heapSize - количество элементов в куче
int largest = i;
if((left <= heapSize) && (a[left] > a[i]))
largest = left;
if((right <= heapSize) && (a[right] > a[largest]))
largest = right;
if(largest != i){
std::swap(a[i], a[largest]);
heapify(a, largest);
}
}
//перестроение в кучу массива длина size
void buildHeap(int a[], int size){
heapSize = size;
for(int i = size/2; i >= 0; i--)
heapify(a, i);
}
//Изменение значения элемента
void heapIncreaseKey(int a[], int i, int key){
if(key < a[i])
return; //Ошибка
a[i] = key;
while((i > 0) && (a[i/2] < a[i])){
std::swap(a[i], a[i/2]);
i = i / 2;
}
}
//Добавление элемента
void heapInsert(int a[], int key){
heapSize = heapSize + 1;
a[heapSize] = -INT_MAX;
heapIncreaseKey(a, heapSize, key);
}
//Извлечение максимального элемента
int heapExtractMax(int a[]){
if(heapSize < 0)
return 0; //Ошибка: куча пуста
int max = a[0];
a[0] = a[heapSize];
heapSize = heapSize - 1;
heapify(a, 0);
return max;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGxpbWl0cz4KI2luY2x1ZGUgImhlYXAuaCIKIAppbnQgaGVhcFNpemU7CiAKLy/QktC+0YHRgdGC0LDQvdC+0LLQu9C10L3QuNC1INGB0LLQvtC50YHRgtCy0LAg0LrRg9GH0LgKdm9pZCBoZWFwaWZ5KGludCBhW10sIGludCBpKXsKICAgIGludCBsZWZ0ID0gMippOwogICAgaW50IHJpZ2h0ID0gMippICsgMTsKICAgIC8vaGVhcFNpemUgLSDQutC+0LvQuNGH0LXRgdGC0LLQviDRjdC70LXQvNC10L3RgtC+0LIg0LIg0LrRg9GH0LUKICAgIGludCBsYXJnZXN0ID0gaTsKICAgIGlmKChsZWZ0IDw9IGhlYXBTaXplKSAmJiAoYVtsZWZ0XSA+IGFbaV0pKQogICAgICAgIGxhcmdlc3QgPSBsZWZ0OwogICAgaWYoKHJpZ2h0IDw9IGhlYXBTaXplKSAmJiAoYVtyaWdodF0gPiBhW2xhcmdlc3RdKSkKICAgICAgICBsYXJnZXN0ID0gcmlnaHQ7CiAgICBpZihsYXJnZXN0ICE9IGkpewogICAgICAgIHN0ZDo6c3dhcChhW2ldLCBhW2xhcmdlc3RdKTsKICAgICAgICBoZWFwaWZ5KGEsIGxhcmdlc3QpOwogICAgfQp9CiAKLy/Qv9C10YDQtdGB0YLRgNC+0LXQvdC40LUg0LIg0LrRg9GH0YMg0LzQsNGB0YHQuNCy0LAg0LTQu9C40L3QsCBzaXplCnZvaWQgYnVpbGRIZWFwKGludCBhW10sIGludCBzaXplKXsKICAgIGhlYXBTaXplID0gc2l6ZTsKICAgIGZvcihpbnQgaSA9IHNpemUvMjsgaSA+PSAwOyBpLS0pCiAgICAgICAgaGVhcGlmeShhLCBpKTsKfQogCi8v0JjQt9C80LXQvdC10L3QuNC1INC30L3QsNGH0LXQvdC40Y8g0Y3Qu9C10LzQtdC90YLQsAp2b2lkIGhlYXBJbmNyZWFzZUtleShpbnQgYVtdLCBpbnQgaSwgaW50IGtleSl7CiAgICBpZihrZXkgPCBhW2ldKQogICAgICAgIHJldHVybjsgLy/QntGI0LjQsdC60LAKICAgIGFbaV0gPSBrZXk7CiAgICB3aGlsZSgoaSA+IDApICYmIChhW2kvMl0gPCBhW2ldKSl7CiAgICAgICAgc3RkOjpzd2FwKGFbaV0sIGFbaS8yXSk7CiAgICAgICAgaSA9IGkgLyAyOwogICAgfQp9CiAKLy/QlNC+0LHQsNCy0LvQtdC90LjQtSDRjdC70LXQvNC10L3RgtCwCnZvaWQgaGVhcEluc2VydChpbnQgYVtdLCBpbnQga2V5KXsKICAgIGhlYXBTaXplID0gaGVhcFNpemUgKyAxOwogICAgYVtoZWFwU2l6ZV0gPSAtSU5UX01BWDsKICAgIGhlYXBJbmNyZWFzZUtleShhLCBoZWFwU2l6ZSwga2V5KTsKfQogCi8v0JjQt9Cy0LvQtdGH0LXQvdC40LUg0LzQsNC60YHQuNC80LDQu9GM0L3QvtCz0L4g0Y3Qu9C10LzQtdC90YLQsAppbnQgaGVhcEV4dHJhY3RNYXgoaW50IGFbXSl7CiAgICBpZihoZWFwU2l6ZSA8IDApCiAgICAgICAgcmV0dXJuIDA7ICAgLy/QntGI0LjQsdC60LA6INC60YPRh9CwINC/0YPRgdGC0LAKICAgIGludCBtYXggPSBhWzBdOwogICAgYVswXSA9IGFbaGVhcFNpemVdOwogICAgaGVhcFNpemUgPSBoZWFwU2l6ZSAtIDE7CiAgICBoZWFwaWZ5KGEsIDApOwogICAgcmV0dXJuIG1heDsKfQ==