#include <bits/stdc++.h>
using std::vector;
using std::swap;
template <class T>
class heap {
public:
heap()
: h(20000000)
{
}
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+CnVzaW5nIHN0ZDo6dmVjdG9yOwp1c2luZyBzdGQ6OnN3YXA7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgaGVhcCB7CnB1YmxpYzoKICAgICAgaGVhcCgpCiAgICAgIDogaCgyMDAwMDAwMCkKICAgICAgewogICAgICB9CglpbnQgc2l6ZSgpIHsKCQlyZXR1cm4gbjsKCX0KCWludCB0b3AoKSB7CgkJcmV0dXJuIGhbMF07Cgl9Cglib29sIGVtcHR5KCkgewoJCXJldHVybiBuID09IDA7Cgl9Cgl2b2lkIHB1c2goVCBhKSB7CgkJaC5wdXNoX2JhY2soYSk7CgkJU2lmdFVwKG4pOwoJCW4rKzsKCX0KCXZvaWQgcG9wKCkgewoJCW4tLTsKCQlzd2FwKGhbbl0sIGhbMF0pOwoJCWgucG9wX2JhY2soKTsKCQlTaWZ0RG93bigwKTsKCX0KCXZvaWQgY2xlYXIoKSB7CgkJaC5jbGVhcigpOwoJCW4gPSAwOwoJfQoJVCBvcGVyYXRvciBbXSAoaW50IGEpIHsKCQlyZXR1cm4gaFthXTsKCX0KcHJpdmF0ZToKCXZlY3RvcjxUPiBoOwoJaW50IG4gPSAwOwoJdm9pZCBTaWZ0VXAoaW50IGEpIHsKCQl3aGlsZSAoYSkgewoJCQlpbnQgcCA9IChhIC0gMSkgLyAyOwoJCQlpZiAoaFtwXSA+IGhbYV0pIHN3YXAoaFtwXSwgaFthXSk7CgkJCWVsc2UgYnJlYWs7CgkJCWEtLTsgYSAvPSAyOwoJCX0KCX0KCXZvaWQgU2lmdERvd24oaW50IGEpIHsKCQl3aGlsZSAoMiAqIGEgKyAxIDwgbikgewoJCQlpbnQgbCA9IDIgKiBhICsgMSwgciA9IDIgKiBhICsgMjsKCQkJaWYgKHIgPT0gbikgewoJCQkJaWYgKGhbbF0gPCBoW2FdKSBzd2FwKGhbbF0sIGhbYV0pOwoJCQkJYnJlYWs7CgkJCX0KCQkJZWxzZSBpZiAoaFtsXSA8PSBoW3JdKSB7CgkJCQlpZiAoaFtsXSA8IGhbYV0pIHsKCQkJCQlzd2FwKGhbbF0sIGhbYV0pOwoJCQkJCWEgPSBsOwoJCQkJfQoJCQkJZWxzZSBicmVhazsKCQkJfQoJCQllbHNlIGlmIChoW3JdIDwgaFthXSkgewoJCQkJc3dhcChoW3JdLCBoW2FdKTsKCQkJCWEgPSByOwoJCQl9CgkJCWVsc2UgYnJlYWs7CgkJfQoJfQp9Owp2b2lkIGhlYXBzb3J0KGludCogbCwgaW50KiByKSB7CgloZWFwPGludD4gaDsKCWZvciAoaW50ICppID0gbDsgaSA8IHI7IGkrKykgaC5wdXNoKCppKTsKCWZvciAoaW50ICppID0gbDsgaSA8IHI7IGkrKykgewoJCSppID0gaC50b3AoKTsKCQloLnBvcCgpOwoJfQp9CgoKdW5zaWduZWQgcm5kID0gMDsKaW50IG15cmFuZG9tKCkgewoJcm5kID0gcm5kICogMTY2NDUyNXUgKyAxMDEzOTA0MjIzdTsKCXJldHVybiBpbnQocm5kID4+IDIpOwp9CgppbnQgY29uc3QgTiA9IDEwMDAwMDAwOwppbnQgYVtOXSwgYltOXTsKCmludCBtYWluICgpIHsKCWZvciAoaW50IGk9MDsgaTxOOyArK2kpCgkJYVtpXSA9IGJbaV0gPSBteXJhbmRvbSgpOwoKCWRvdWJsZSB0MSA9IGNsb2NrKCk7CgloZWFwc29ydChhLCBhK04pOwoJdDEgPSAoY2xvY2soKS10MSkvQ0xPQ0tTX1BFUl9TRUM7CgoJZG91YmxlIHQyID0gY2xvY2soKTsKCXN0ZDo6bWFrZV9oZWFwKGIsIGIrTik7CglzdGQ6OnNvcnRfaGVhcChiLCBiK04pOwoJdDIgPSAoY2xvY2soKS10MikvQ0xPQ0tTX1BFUl9TRUM7CgoJc3RkOjpjb3V0IDw8IHQxIDw8ICdcbicgPDwgdDIgPDwgJ1xuJzsKfQ==