#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;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGxpbWl0cz4KI2luY2x1ZGUgImhlYXAuaCIKCmludCBoZWFwU2l6ZTsKCi8v0JLQvtGB0YHRgtCw0L3QvtCy0LvQtdC90LjQtSDRgdCy0L7QudGB0YLQstCwINC60YPRh9C4CnZvaWQgaGVhcGlmeShpbnQgYVtdLCBpbnQgaSl7CglpbnQgbGVmdCA9IDIqaTsKCWludCByaWdodCA9IDIqaSArIDE7CgkvL2hlYXBTaXplIC0g0LrQvtC70LjRh9C10YHRgtCy0L4g0Y3Qu9C10LzQtdC90YLQvtCyINCyINC60YPRh9C1CglpbnQgbGFyZ2VzdCA9IGk7CglpZigobGVmdCA8PSBoZWFwU2l6ZSkgJiYgKGFbbGVmdF0gPiBhW2ldKSkKCQlsYXJnZXN0ID0gbGVmdDsKCWlmKChyaWdodCA8PSBoZWFwU2l6ZSkgJiYgKGFbcmlnaHRdID4gYVtsYXJnZXN0XSkpCgkJbGFyZ2VzdCA9IHJpZ2h0OwoJaWYobGFyZ2VzdCAhPSBpKXsKCQlzdGQ6OnN3YXAoYVtpXSwgYVtsYXJnZXN0XSk7CgkJaGVhcGlmeShhLCBsYXJnZXN0KTsKCX0KfQoKLy/Qv9C10YDQtdGB0YLRgNC+0LXQvdC40LUg0LIg0LrRg9GH0YMg0LzQsNGB0YHQuNCy0LAg0LTQu9C40L3QsCBzaXplCnZvaWQgYnVpbGRIZWFwKGludCBhW10sIGludCBzaXplKXsKCWhlYXBTaXplID0gc2l6ZTsKCWZvcihpbnQgaSA9IHNpemUvMjsgaSA+PSAwOyBpLS0pCgkJaGVhcGlmeShhLCBpKTsKfQoKLy/QmNC30LzQtdC90LXQvdC40LUg0LfQvdCw0YfQtdC90LjRjyDRjdC70LXQvNC10L3RgtCwCnZvaWQgaGVhcEluY3JlYXNlS2V5KGludCBhW10sIGludCBpLCBpbnQga2V5KXsKCWlmKGtleSA8IGFbaV0pCgkJcmV0dXJuOwkvL9Ce0YjQuNCx0LrQsAoJYVtpXSA9IGtleTsKCXdoaWxlKChpID4gMCkgJiYgKGFbaS8yXSA8IGFbaV0pKXsKCQlzdGQ6OnN3YXAoYVtpXSwgYVtpLzJdKTsKCQlpID0gaSAvIDI7Cgl9Cn0KCi8v0JTQvtCx0LDQstC70LXQvdC40LUg0Y3Qu9C10LzQtdC90YLQsAp2b2lkIGhlYXBJbnNlcnQoaW50IGFbXSwgaW50IGtleSl7CgloZWFwU2l6ZSA9IGhlYXBTaXplICsgMTsKCWFbaGVhcFNpemVdID0gLUlOVF9NQVg7CgloZWFwSW5jcmVhc2VLZXkoYSwgaGVhcFNpemUsIGtleSk7Cn0KCi8v0JjQt9Cy0LvQtdGH0LXQvdC40LUg0LzQsNC60YHQuNC80LDQu9GM0L3QvtCz0L4g0Y3Qu9C10LzQtdC90YLQsAppbnQgaGVhcEV4dHJhY3RNYXgoaW50IGFbXSl7CglpZihoZWFwU2l6ZSA8IDApCgkJcmV0dXJuIDA7CS8v0J7RiNC40LHQutCwOiDQutGD0YfQsCDQv9GD0YHRgtCwCglpbnQgbWF4ID0gYVswXTsKCWFbMF0gPSBhW2hlYXBTaXplXTsKCWhlYXBTaXplID0gaGVhcFNpemUgLSAxOwoJaGVhcGlmeShhLCAwKTsKCXJldHVybiBtYXg7Cn0=