#include <iostream>
#define d 3 /*Арность кучи*/
/*Реализация функций перестроения бинарной кучи*/
template <class Item>
void fixUp(Item a[], int node){
while(node > 1 && a[node/2] < a[node]){
std::swap(a[node], a[node/2]);
node = node / 2;
}
}
template <class Item>
void fixDown(Item a[], int node, int n){
while(2*node <= n){
int j = 2*node;
if(j < n && a[j] < a[j + 1]) j++;
if(!(a[node] < a[j])) break;
std::swap(a[node], a[j]);
node = j;
}
}
/*Реализация функций перестроения d-арной кучи*/
template <class Item>
void d_ary_fixUp(Item a[], int node){
while(node > 1 && a[(node - 1)/d] < a[node]){
std::swap(a[node], a[(node - 1)/d]);
node = (node - 1) / d;
}
}
template <class Item>
void d_ary_fixDown(Item a[], int node, int n){
while(d*node <= n){
int j = d*node;
if(j < n && a[j] < a[j + 1]) j++;
if(!(a[node] < a[j])) break;
std::swap(a[node], a[j]);
node = j;
}
}
template <class Item>
class PQ{
private:
Item *pq;
int n;
public:
PQ(int max){
pq = new Item[max + 1];
n = 0;
}
~PQ(){
delete[] pq;
}
int empty() const{
return n == 0;
}
void insert(Item item){
pq[++n] = item;
d_ary_fixUp(pq, n);
}
Item getmax(){
if(!empty()){
std::swap(pq[1], pq[n]);
d_ary_fixDown(pq, 1, n-1);
return pq[n--];
}else
return 0;
}
};
int main(){
PQ<int> pq(50);
int p;
for(int i = 0; i < 10; i++)
pq.insert(i);
for(int i = 0; i < 10; i++)
std::cout << pq.getmax() << " ";
std::cin >> p;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2RlZmluZSBkIDMJLyrQkNGA0L3QvtGB0YLRjCDQutGD0YfQuCovCgovKtCg0LXQsNC70LjQt9Cw0YbQuNGPINGE0YPQvdC60YbQuNC5INC/0LXRgNC10YHRgtGA0L7QtdC90LjRjyDQsdC40L3QsNGA0L3QvtC5INC60YPRh9C4Ki8KdGVtcGxhdGUgPGNsYXNzIEl0ZW0+CnZvaWQgZml4VXAoSXRlbSBhW10sIGludCBub2RlKXsKCXdoaWxlKG5vZGUgPiAxICYmIGFbbm9kZS8yXSA8IGFbbm9kZV0pewoJCXN0ZDo6c3dhcChhW25vZGVdLCBhW25vZGUvMl0pOwoJCW5vZGUgPSBub2RlIC8gMjsKCX0KfQoKdGVtcGxhdGUgPGNsYXNzIEl0ZW0+CnZvaWQgZml4RG93bihJdGVtIGFbXSwgaW50IG5vZGUsIGludCBuKXsKCXdoaWxlKDIqbm9kZSA8PSBuKXsKCQlpbnQgaiA9IDIqbm9kZTsKCgkJaWYoaiA8IG4gJiYgYVtqXSA8IGFbaiArIDFdKSBqKys7CgkJaWYoIShhW25vZGVdIDwgYVtqXSkpIGJyZWFrOwoJCXN0ZDo6c3dhcChhW25vZGVdLCBhW2pdKTsKCQlub2RlID0gajsKCX0KfQoKLyrQoNC10LDQu9C40LfQsNGG0LjRjyDRhNGD0L3QutGG0LjQuSDQv9C10YDQtdGB0YLRgNC+0LXQvdC40Y8gZC3QsNGA0L3QvtC5INC60YPRh9C4Ki8KdGVtcGxhdGUgPGNsYXNzIEl0ZW0+CnZvaWQgZF9hcnlfZml4VXAoSXRlbSBhW10sIGludCBub2RlKXsKCXdoaWxlKG5vZGUgPiAxICYmIGFbKG5vZGUgLSAxKS9kXSA8IGFbbm9kZV0pewoJCXN0ZDo6c3dhcChhW25vZGVdLCBhWyhub2RlIC0gMSkvZF0pOwoJCW5vZGUgPSAobm9kZSAtIDEpIC8gZDsKCX0KfQoKdGVtcGxhdGUgPGNsYXNzIEl0ZW0+CnZvaWQgZF9hcnlfZml4RG93bihJdGVtIGFbXSwgaW50IG5vZGUsIGludCBuKXsKCXdoaWxlKGQqbm9kZSA8PSBuKXsKCQlpbnQgaiA9IGQqbm9kZTsKCgkJaWYoaiA8IG4gJiYgYVtqXSA8IGFbaiArIDFdKSBqKys7CgkJaWYoIShhW25vZGVdIDwgYVtqXSkpIGJyZWFrOwoJCXN0ZDo6c3dhcChhW25vZGVdLCBhW2pdKTsKCQlub2RlID0gajsKCX0KfQoKdGVtcGxhdGUgPGNsYXNzIEl0ZW0+CmNsYXNzIFBRewpwcml2YXRlOgoJSXRlbSAqcHE7CglpbnQgbjsKcHVibGljOgoJUFEoaW50IG1heCl7CgkJcHEgPSBuZXcgSXRlbVttYXggKyAxXTsKCQluID0gMDsKCX0KCgl+UFEoKXsKCQlkZWxldGVbXSBwcTsKCX0KCglpbnQgZW1wdHkoKSBjb25zdHsKCQlyZXR1cm4gbiA9PSAwOwoJfQoKCXZvaWQgaW5zZXJ0KEl0ZW0gaXRlbSl7CgkJcHFbKytuXSA9IGl0ZW07CgkJZF9hcnlfZml4VXAocHEsIG4pOwoJfQoKCUl0ZW0gZ2V0bWF4KCl7CgkJaWYoIWVtcHR5KCkpewoJCQlzdGQ6OnN3YXAocHFbMV0sIHBxW25dKTsKCQkJZF9hcnlfZml4RG93bihwcSwgMSwgbi0xKTsKCQkJcmV0dXJuIHBxW24tLV07CgkJfWVsc2UKCQkJcmV0dXJuIDA7Cgl9Cn07CgppbnQgbWFpbigpewoJUFE8aW50PiBwcSg1MCk7CglpbnQgcDsKCglmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKCQlwcS5pbnNlcnQoaSk7Cglmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKCQlzdGQ6OmNvdXQgPDwgcHEuZ2V0bWF4KCkgPDwgIiAiOwoJc3RkOjpjaW4gPj4gcDsKfQ==