#include <bits/stdc++.h>
using std::vector;
using std::swap;
template <class T>
class heap {
public:
int size() {
return n;
}
int top() {
return h[0];
}
bool empty() {
return n == 0;
}
void push(T a) {
h.push_back(a);
SiftUp(n);
n++;
}
void pop() {
n--;
swap(h[n], h[0]);
h.pop_back();
SiftDown(0);
}
void clear() {
h.clear();
n = 0;
}
T operator [] (int a) {
return h[a];
}
private:
vector<T> h;
int n = 0;
void SiftUp(int a) {
while (a) {
int p = (a - 1) / 2;
if (h[p] > h[a]) swap(h[p], h[a]);
else break;
a--; a /= 2;
}
}
void SiftDown(int a) {
while (2 * a + 1 < n) {
int l = 2 * a + 1, r = 2 * a + 2;
if (r == n) {
if (h[l] < h[a]) swap(h[l], h[a]);
break;
}
else if (h[l] <= h[r]) {
if (h[l] < h[a]) {
swap(h[l], h[a]);
a = l;
}
else break;
}
else if (h[r] < h[a]) {
swap(h[r], h[a]);
a = r;
}
else break;
}
}
};
void heapsort(int* l, int* r) {
heap<int> h;
for (int *i = l; i < r; i++) h.push(*i);
for (int *i = l; i < r; i++) {
*i = h.top();
h.pop();
}
}
unsigned rnd = 0;
int myrandom() {
rnd = rnd * 1664525u + 1013904223u;
return int(rnd >> 2);
}
int const N = 10000000;
int a[N], b[N];
int main () {
for (int i=0; i<N; ++i)
a[i] = b[i] = myrandom();
double t1 = clock();
heapsort(a, a+N);
t1 = (clock()-t1)/CLOCKS_PER_SEC;
double t2 = clock();
std::make_heap(b, b+N);
std::sort_heap(b, b+N);
t2 = (clock()-t2)/CLOCKS_PER_SEC;
std::cout << t1 << '\n' << t2 << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIHN0ZDo6dmVjdG9yOwp1c2luZyBzdGQ6OnN3YXA7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgaGVhcCB7CnB1YmxpYzoKCWludCBzaXplKCkgewoJCXJldHVybiBuOwoJfQoJaW50IHRvcCgpIHsKCQlyZXR1cm4gaFswXTsKCX0KCWJvb2wgZW1wdHkoKSB7CgkJcmV0dXJuIG4gPT0gMDsKCX0KCXZvaWQgcHVzaChUIGEpIHsKCQloLnB1c2hfYmFjayhhKTsKCQlTaWZ0VXAobik7CgkJbisrOwoJfQoJdm9pZCBwb3AoKSB7CgkJbi0tOwoJCXN3YXAoaFtuXSwgaFswXSk7CgkJaC5wb3BfYmFjaygpOwoJCVNpZnREb3duKDApOwoJfQoJdm9pZCBjbGVhcigpIHsKCQloLmNsZWFyKCk7CgkJbiA9IDA7Cgl9CglUIG9wZXJhdG9yIFtdIChpbnQgYSkgewoJCXJldHVybiBoW2FdOwoJfQpwcml2YXRlOgoJdmVjdG9yPFQ+IGg7CglpbnQgbiA9IDA7Cgl2b2lkIFNpZnRVcChpbnQgYSkgewoJCXdoaWxlIChhKSB7CgkJCWludCBwID0gKGEgLSAxKSAvIDI7CgkJCWlmIChoW3BdID4gaFthXSkgc3dhcChoW3BdLCBoW2FdKTsKCQkJZWxzZSBicmVhazsKCQkJYS0tOyBhIC89IDI7CgkJfQoJfQoJdm9pZCBTaWZ0RG93bihpbnQgYSkgewoJCXdoaWxlICgyICogYSArIDEgPCBuKSB7CgkJCWludCBsID0gMiAqIGEgKyAxLCByID0gMiAqIGEgKyAyOwoJCQlpZiAociA9PSBuKSB7CgkJCQlpZiAoaFtsXSA8IGhbYV0pIHN3YXAoaFtsXSwgaFthXSk7CgkJCQlicmVhazsKCQkJfQoJCQllbHNlIGlmIChoW2xdIDw9IGhbcl0pIHsKCQkJCWlmIChoW2xdIDwgaFthXSkgewoJCQkJCXN3YXAoaFtsXSwgaFthXSk7CgkJCQkJYSA9IGw7CgkJCQl9CgkJCQllbHNlIGJyZWFrOwoJCQl9CgkJCWVsc2UgaWYgKGhbcl0gPCBoW2FdKSB7CgkJCQlzd2FwKGhbcl0sIGhbYV0pOwoJCQkJYSA9IHI7CgkJCX0KCQkJZWxzZSBicmVhazsKCQl9Cgl9Cn07CnZvaWQgaGVhcHNvcnQoaW50KiBsLCBpbnQqIHIpIHsKCWhlYXA8aW50PiBoOwoJZm9yIChpbnQgKmkgPSBsOyBpIDwgcjsgaSsrKSBoLnB1c2goKmkpOwoJZm9yIChpbnQgKmkgPSBsOyBpIDwgcjsgaSsrKSB7CgkJKmkgPSBoLnRvcCgpOwoJCWgucG9wKCk7Cgl9Cn0KCgp1bnNpZ25lZCBybmQgPSAwOwppbnQgbXlyYW5kb20oKSB7CglybmQgPSBybmQgKiAxNjY0NTI1dSArIDEwMTM5MDQyMjN1OwoJcmV0dXJuIGludChybmQgPj4gMik7Cn0KCmludCBjb25zdCBOID0gMTAwMDAwMDA7CmludCBhW05dLCBiW05dOwoKaW50IG1haW4gKCkgewoJZm9yIChpbnQgaT0wOyBpPE47ICsraSkKCQlhW2ldID0gYltpXSA9IG15cmFuZG9tKCk7CgoJZG91YmxlIHQxID0gY2xvY2soKTsKCWhlYXBzb3J0KGEsIGErTik7Cgl0MSA9IChjbG9jaygpLXQxKS9DTE9DS1NfUEVSX1NFQzsKCglkb3VibGUgdDIgPSBjbG9jaygpOwoJc3RkOjptYWtlX2hlYXAoYiwgYitOKTsKCXN0ZDo6c29ydF9oZWFwKGIsIGIrTik7Cgl0MiA9IChjbG9jaygpLXQyKS9DTE9DS1NfUEVSX1NFQzsKCglzdGQ6OmNvdXQgPDwgdDEgPDwgJ1xuJyA8PCB0MiA8PCAnXG4nOwp9