#include <algorithm>
#include "dheap.h"
const int d = 19;
//Всплытие
void siftup(int *a, int i){
int p = (i - 1) / d;
while((i != 0) && (a[p] > a[i])){
std::swap(i, p);
i = p;
p = (i - 1) / d;
}
}
//n - длина массива
int min_child(int *a, int i, int n){
if(i*d + 1 >= n) return 0;
else{
int s = i*d + 1;
int min_key = a[s];
int last = (i + 1)*d;
if(last >= n) last = n - 1;
for(int j = s+1; j <= last; j++){
if(min_key > a[j]){
min_key = a[j];
s = j;
}
return s;
}
}
}
//Погружение
void siftdown(int *a, int i, int n){
int s = min_child(a, i, n);
while((s != 0) && (a[i] > a[s])){
std::swap(i, s);
i = s;
s = min_child(a, i, n);
}
}
//Преобразование массива в кучу
void build_dheap(int *a, int n){
for(int i = (n - 1)/d; i >= 0; i--)
siftdown(a, i, n);
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgImRoZWFwLmgiCgpjb25zdCBpbnQgZCA9IDE5OwoKLy/QktGB0L/Qu9GL0YLQuNC1CnZvaWQgc2lmdHVwKGludCAqYSwgaW50IGkpewoJaW50IHAgPSAoaSAtIDEpIC8gZDsKCXdoaWxlKChpICE9IDApICYmIChhW3BdID4gYVtpXSkpewoJCXN0ZDo6c3dhcChpLCBwKTsKCQlpID0gcDsKCQlwID0gKGkgLSAxKSAvIGQ7Cgl9Cn0KCi8vbiAtINC00LvQuNC90LAg0LzQsNGB0YHQuNCy0LAKaW50IG1pbl9jaGlsZChpbnQgKmEsIGludCBpLCBpbnQgbil7CglpZihpKmQgKyAxID49IG4pIHJldHVybiAwOwoJZWxzZXsKCQlpbnQgcyA9IGkqZCArIDE7CgkJaW50IG1pbl9rZXkgPSBhW3NdOwoJCWludCBsYXN0ID0gKGkgKyAxKSpkOwoJCWlmKGxhc3QgPj0gbikgbGFzdCA9IG4gLSAxOwoJCWZvcihpbnQgaiA9IHMrMTsgaiA8PSBsYXN0OyBqKyspewoJCQlpZihtaW5fa2V5ID4gYVtqXSl7CgkJCQltaW5fa2V5ID0gYVtqXTsKCQkJCXMgPSBqOwoJCQl9CgkJCXJldHVybiBzOwoJCX0KCX0KfQoKLy/Qn9C+0LPRgNGD0LbQtdC90LjQtQp2b2lkIHNpZnRkb3duKGludCAqYSwgaW50IGksIGludCBuKXsKCWludCBzID0gbWluX2NoaWxkKGEsIGksIG4pOwoJd2hpbGUoKHMgIT0gMCkgJiYgKGFbaV0gPiBhW3NdKSl7CgkJc3RkOjpzd2FwKGksIHMpOwoJCWkgPSBzOwoJCXMgPSBtaW5fY2hpbGQoYSwgaSwgbik7Cgl9Cn0KCi8v0J/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSDQvNCw0YHRgdC40LLQsCDQsiDQutGD0YfRgwp2b2lkIGJ1aWxkX2RoZWFwKGludCAqYSwgaW50IG4pewoJZm9yKGludCBpID0gKG4gLSAxKS9kOyBpID49IDA7IGktLSkKCQlzaWZ0ZG93bihhLCBpLCBuKTsKfQ==