#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <stdint.h>
#include <float.h>
#include <sys/time.h>
#define ELEMS 9000000
#define TOPSS 1000
typedef double val_t;
inline static double baka_sec_count(void) {
struct timeval tv;
gettimeofday(&tv, NULL);
return (double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0);
}
inline static uint64_t rand64(void) {
static uint64_t x = 88172645463325252ULL;
x = x ^ (x << 13);
x = x ^ (x >> 7);
return x = x ^ (x << 17);
}
inline static val_t* alloc_data(int n_) {
val_t
* p
= (val_t
*)malloc(sizeof(val_t
) * n_
);
for (int i = 0; i < n_; ++i) {
p[i] = rand64();
}
return p;
}
inline static void aho_select(val_t* arr_, int n_, val_t* top_, int k_) {
for (int i = 0; i < k_; ++i) {
top_[i] = -DBL_MAX;
}
for (int i = 0; i < n_; ++i) {
for (int j = 0; j < k_; ++j) {
if (top_[j] < arr_[i]) {
for (int l = k_ - 1; l > j; --l) {
top_[l] = top_[l - 1];
}
top_[j] = arr_[i];
break;
}
}
}
}
inline static void free_data(double* p_) {
}
int main(int argc, char* argv[]) {
val_t top[1000];
val_t* p1 = alloc_data(ELEMS);
double s;
double e;
s = baka_sec_count();
aho_select(p1, ELEMS, top, sizeof(top) / sizeof(val_t));
e = baka_sec_count();
fprintf(stderr
, "turnaround time ::= %.04lf sec\n", e
-s
);
free_data(p1);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1lbW9yeS5oPgojaW5jbHVkZSA8c3RkaW50Lmg+CiNpbmNsdWRlIDxmbG9hdC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KCiNkZWZpbmUgRUxFTVMgOTAwMDAwMAojZGVmaW5lIFRPUFNTIDEwMDAKCnR5cGVkZWYgZG91YmxlIHZhbF90OwoKaW5saW5lIHN0YXRpYyBkb3VibGUgYmFrYV9zZWNfY291bnQodm9pZCkgewogICAgc3RydWN0IHRpbWV2YWwgdHY7CiAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKCXJldHVybiAoZG91YmxlKXR2LnR2X3NlYyArICgoZG91YmxlKXR2LnR2X3VzZWMgLyAxMDAwMDAwLjApOwoKfQoKaW5saW5lIHN0YXRpYyB1aW50NjRfdCByYW5kNjQodm9pZCkgewoJc3RhdGljIHVpbnQ2NF90IHggPSA4ODE3MjY0NTQ2MzMyNTI1MlVMTDsKCXggPSB4IF4gKHggPDwgMTMpOwoJeCA9IHggXiAoeCA+PiA3KTsKCXJldHVybiB4ID0geCBeICh4IDw8IDE3KTsKfQoKaW5saW5lIHN0YXRpYyB2YWxfdCogYWxsb2NfZGF0YShpbnQgbl8pIHsKCXZhbF90KiBwID0gKHZhbF90KiltYWxsb2Moc2l6ZW9mKHZhbF90KSAqIG5fKTsKCglmb3IgKGludCBpID0gMDsgaSA8IG5fOyArK2kpIHsKCQlwW2ldID0gcmFuZDY0KCk7Cgl9CgoJcmV0dXJuIHA7Cn0KCmlubGluZSBzdGF0aWMgdm9pZCBhaG9fc2VsZWN0KHZhbF90KiBhcnJfLCBpbnQgbl8sIHZhbF90KiB0b3BfLCBpbnQga18pIHsKCglmb3IgKGludCBpID0gMDsgaSA8IGtfOyArK2kpIHsKCQl0b3BfW2ldID0gLURCTF9NQVg7Cgl9CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBuXzsgKytpKSB7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBrXzsgKytqKSB7CgkJCWlmICh0b3BfW2pdIDwgYXJyX1tpXSkgewoJCQkJZm9yIChpbnQgbCA9IGtfIC0gMTsgbCA+IGo7IC0tbCkgewoJCQkJCXRvcF9bbF0gPSB0b3BfW2wgLSAxXTsKCQkJCX0KCQkJCXRvcF9bal0gPSBhcnJfW2ldOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCmlubGluZSBzdGF0aWMgdm9pZCBmcmVlX2RhdGEoZG91YmxlKiBwXykgewoJZnJlZShwXyk7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKCXZhbF90ICB0b3BbMTAwMF07Cgl2YWxfdCogcDEgPSBhbGxvY19kYXRhKEVMRU1TKTsKCWRvdWJsZSBzOwoJZG91YmxlIGU7CgoJcyA9IGJha2Ffc2VjX2NvdW50KCk7CglhaG9fc2VsZWN0KHAxLCBFTEVNUywgdG9wLCBzaXplb2YodG9wKSAvIHNpemVvZih2YWxfdCkpOwoJZSA9IGJha2Ffc2VjX2NvdW50KCk7CglmcHJpbnRmKHN0ZGVyciwgInR1cm5hcm91bmQgdGltZSA6Oj0gJS4wNGxmIHNlY1xuIiwgZS1zKTsKCglmcmVlX2RhdGEocDEpOwoJcmV0dXJuIDA7Cn0K