#include <iostream>
const int 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 + d - 2)/d] < a[node]){
std::swap(a[node], a[(node + d - 2)/d]);
node = (node + d - 2) / d;
}
}
template <class Item>
void d_ary_fixDown(Item a[], int node, int n){
int first_child = node*d + 1 - (d - 1);
int last_child = node*d - 1;
int max_child = first_child; /*Начнем с самого первого*/
while(d*node <= n){
/*Находим максимального потомка*/
for(int i = first_child; i <= last_child; i++)
if(a[i] > a[max_child])
max_child = i;
/*Если он больше родителя, меняем их местами*/
if(a[max_child] > a[(max_child + d - 2) / d])
std::swap(a[max_child], a[(max_child + d - 2) / d]);
node = max_child;
}
}
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY29uc3QgaW50IGQgPSAzOwkvKtCQ0YDQvdC+0YHRgtGMINC60YPRh9C4Ki8KCi8q0KDQtdCw0LvQuNC30LDRhtC40Y8g0YTRg9C90LrRhtC40Lkg0L/QtdGA0LXRgdGC0YDQvtC10L3QuNGPINCx0LjQvdCw0YDQvdC+0Lkg0LrRg9GH0LgqLwp0ZW1wbGF0ZSA8Y2xhc3MgSXRlbT4Kdm9pZCBmaXhVcChJdGVtIGFbXSwgaW50IG5vZGUpewoJd2hpbGUobm9kZSA+IDEgJiYgYVtub2RlLzJdIDwgYVtub2RlXSl7CgkJc3RkOjpzd2FwKGFbbm9kZV0sIGFbbm9kZS8yXSk7CgkJbm9kZSA9IG5vZGUgLyAyOwoJfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgSXRlbT4Kdm9pZCBmaXhEb3duKEl0ZW0gYVtdLCBpbnQgbm9kZSwgaW50IG4pewoJd2hpbGUoMipub2RlIDw9IG4pewoJCWludCBqID0gMipub2RlOwoKCQlpZihqIDwgbiAmJiBhW2pdIDwgYVtqICsgMV0pIGorKzsKCQlpZighKGFbbm9kZV0gPCBhW2pdKSkgYnJlYWs7CgkJc3RkOjpzd2FwKGFbbm9kZV0sIGFbal0pOwoJCW5vZGUgPSBqOwoJfQp9CgovKtCg0LXQsNC70LjQt9Cw0YbQuNGPINGE0YPQvdC60YbQuNC5INC/0LXRgNC10YHRgtGA0L7QtdC90LjRjyBkLdCw0YDQvdC+0Lkg0LrRg9GH0LgqLwp0ZW1wbGF0ZSA8Y2xhc3MgSXRlbT4Kdm9pZCBkX2FyeV9maXhVcChJdGVtIGFbXSwgaW50IG5vZGUpewoJd2hpbGUobm9kZSA+IDEgJiYgYVsobm9kZSArIGQgLSAyKS9kXSA8IGFbbm9kZV0pewoJCXN0ZDo6c3dhcChhW25vZGVdLCBhWyhub2RlICsgZCAtIDIpL2RdKTsKCQlub2RlID0gKG5vZGUgKyBkIC0gMikgLyBkOwoJfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgSXRlbT4Kdm9pZCBkX2FyeV9maXhEb3duKEl0ZW0gYVtdLCBpbnQgbm9kZSwgaW50IG4pewoJaW50IGZpcnN0X2NoaWxkID0gbm9kZSpkICsgMSAtIChkIC0gMSk7CglpbnQgbGFzdF9jaGlsZCA9IG5vZGUqZCAtIDE7CglpbnQgbWF4X2NoaWxkID0gZmlyc3RfY2hpbGQ7CS8q0J3QsNGH0L3QtdC8INGBINGB0LDQvNC+0LPQviDQv9C10YDQstC+0LPQviovCgoJd2hpbGUoZCpub2RlIDw9IG4pewoJCS8q0J3QsNGF0L7QtNC40Lwg0LzQsNC60YHQuNC80LDQu9GM0L3QvtCz0L4g0L/QvtGC0L7QvNC60LAqLwoJCWZvcihpbnQgaSA9IGZpcnN0X2NoaWxkOyBpIDw9IGxhc3RfY2hpbGQ7IGkrKykKCQkJaWYoYVtpXSA+IGFbbWF4X2NoaWxkXSkKCQkJCW1heF9jaGlsZCA9IGk7CgkJLyrQldGB0LvQuCDQvtC9INCx0L7Qu9GM0YjQtSDRgNC+0LTQuNGC0LXQu9GPLCDQvNC10L3Rj9C10Lwg0LjRhSDQvNC10YHRgtCw0LzQuCovCgkJaWYoYVttYXhfY2hpbGRdID4gYVsobWF4X2NoaWxkICsgZCAtIDIpIC8gZF0pCgkJCXN0ZDo6c3dhcChhW21heF9jaGlsZF0sIGFbKG1heF9jaGlsZCArIGQgLSAyKSAvIGRdKTsKCQlub2RlID0gbWF4X2NoaWxkOwoJfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgSXRlbT4KY2xhc3MgUFF7CnByaXZhdGU6CglJdGVtICpwcTsKCWludCBuOwpwdWJsaWM6CglQUShpbnQgbWF4KXsKCQlwcSA9IG5ldyBJdGVtW21heCArIDFdOwoJCW4gPSAwOwoJfQoKCX5QUSgpewoJCWRlbGV0ZVtdIHBxOwoJfQoKCWludCBlbXB0eSgpIGNvbnN0ewoJCXJldHVybiBuID09IDA7Cgl9CgoJdm9pZCBpbnNlcnQoSXRlbSBpdGVtKXsKCQlwcVsrK25dID0gaXRlbTsKCQlkX2FyeV9maXhVcChwcSwgbik7Cgl9CgoJSXRlbSBnZXRtYXgoKXsKCQlpZighZW1wdHkoKSl7CgkJCXN0ZDo6c3dhcChwcVsxXSwgcHFbbl0pOwoJCQlkX2FyeV9maXhEb3duKHBxLCAxLCBuLTEpOwoJCQlyZXR1cm4gcHFbbi0tXTsKCQl9ZWxzZQoJCQlyZXR1cm4gMDsKCX0KfTsKCmludCBtYWluKCl7CglQUTxpbnQ+IHBxKDUwKTsKCWludCBwOwoKCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQoJCXBxLmluc2VydChpKTsKCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQoJCXN0ZDo6Y291dCA8PCBwcS5nZXRtYXgoKSA8PCAiICI7CglzdGQ6OmNpbiA+PiBwOwp9