#include <iostream>
#include <cstdlib>
using namespace std;
struct node {
int data;
struct node *next;
};
void traverse(struct node *head)
{
while ( head != NULL ){
cout << head->data << endl;
head = head->next;
}
}
void insert ( struct node **head, int num)
{
struct node *temp = (struct node*) malloc(sizeof(struct node));
temp->data = num;
temp->next = NULL;
if ( *head == NULL ){
*head = temp;
return;
}
temp->next = *head;
*head = temp;
}
void merge( struct node **head ,struct node *b)
{
struct node dummy;
struct node *a = *head;
struct node *result = &dummy;
dummy.next = NULL;
while (1)
{
if ( a == NULL && b == NULL) {
break;
}
if ( a == NULL ){
result->next = b;
break;
}
if ( b == NULL ){
result->next = a;
break;
}
if ( a->data < b->data){
result->next = a;
a = a->next;
result = result->next;
result->next = NULL;
}
else {
result->next = b;
b = b->next;
result = result->next;
result->next = NULL;
}
}
*head = dummy.next;
}
void merge_sort( struct node **head, int n)
{
if ( *head ==NULL || (*head)->next == NULL ){
return;
}
int count = 0;
struct node *temp = *head;
int mid = n/2;
struct node *p;
while (temp != NULL && count < mid ) {
p = temp;
temp = temp->next;
count++;
}
p->next = NULL;
merge_sort(head,mid);
merge_sort(&temp,n-mid);
merge(head,temp);
}
int main()
{
struct node *head = NULL;
int n;
cin >> n;
for ( int i = 0; i < n; i++ ){
int x;
cin >> x;
insert(&head,x);
}
merge_sort(&head,n);
traverse(head);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3Qgbm9kZSB7CiAgaW50IGRhdGE7CiAgc3RydWN0IG5vZGUgKm5leHQ7Cgp9OwoKdm9pZCB0cmF2ZXJzZShzdHJ1Y3Qgbm9kZSAqaGVhZCkKewogICAgd2hpbGUgKCBoZWFkICE9IE5VTEwgKXsKICAgICAgICAgY291dCA8PCBoZWFkLT5kYXRhIDw8IGVuZGw7CiAgICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgICB9Cn0KCgp2b2lkIGluc2VydCAoIHN0cnVjdCBub2RlICoqaGVhZCwgaW50IG51bSkKewogICAgICBzdHJ1Y3Qgbm9kZSAqdGVtcCA9IChzdHJ1Y3Qgbm9kZSopIG1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKICAgICAgdGVtcC0+ZGF0YSA9IG51bTsKICAgICAgdGVtcC0+bmV4dCA9IE5VTEw7CiAgICAgaWYgKCAqaGVhZCA9PSBOVUxMICl7CiAgICAgICAgICAqaGVhZCA9IHRlbXA7CiAgICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHRlbXAtPm5leHQgPSAqaGVhZDsKICAgICAqaGVhZCA9IHRlbXA7Cgp9Cgp2b2lkIG1lcmdlKCBzdHJ1Y3Qgbm9kZSAqKmhlYWQgLHN0cnVjdCBub2RlICpiKQp7CiAgICBzdHJ1Y3Qgbm9kZSBkdW1teTsKICAgIHN0cnVjdCBub2RlICphID0gKmhlYWQ7CiAgICBzdHJ1Y3Qgbm9kZSAqcmVzdWx0ID0gJmR1bW15OwogICAgZHVtbXkubmV4dCA9IE5VTEw7CgogICAgd2hpbGUgKDEpCiAgICB7CiAgICAgICAgIGlmICggYSA9PSBOVUxMICYmIGIgPT0gTlVMTCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoICBhID09IE5VTEwgKXsKICAgICAgICAgICAgcmVzdWx0LT5uZXh0ID0gYjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCBiID09IE5VTEwgKXsKICAgICAgICAgICAgcmVzdWx0LT5uZXh0ID0gYTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCBhLT5kYXRhIDwgYi0+ZGF0YSl7CgogICAgICAgICAgICAgIHJlc3VsdC0+bmV4dCA9IGE7CiAgICAgICAgICAgICAgYSA9IGEtPm5leHQ7CiAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LT5uZXh0OwogICAgICAgICAgICAgIHJlc3VsdC0+bmV4dCA9IE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXN1bHQtPm5leHQgPSBiOwogICAgICAgICAgICAgICBiID0gYi0+bmV4dDsKICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQtPm5leHQ7CiAgICAgICAgICAgICAgcmVzdWx0LT5uZXh0ID0gTlVMTDsKCiAgICAgICAgIH0KCgoKCiAgICB9CgogICAgKmhlYWQgPSBkdW1teS5uZXh0OwoKfQoKdm9pZCBtZXJnZV9zb3J0KCBzdHJ1Y3Qgbm9kZSAqKmhlYWQsIGludCBuKQp7CgogICAgICBpZiAoICpoZWFkID09TlVMTCB8fCAoKmhlYWQpLT5uZXh0ID09IE5VTEwgKXsKICAgICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgc3RydWN0IG5vZGUgKnRlbXAgPSAqaGVhZDsKICAgICAgaW50IG1pZCA9IG4vMjsKICAgICAgc3RydWN0IG5vZGUgKnA7CiAgICAgIHdoaWxlICh0ZW1wICE9IE5VTEwgJiYgY291bnQgPCBtaWQgKSB7CiAgICAgICAgICAgcCA9IHRlbXA7CiAgICAgICAgICAgdGVtcCA9IHRlbXAtPm5leHQ7CiAgICAgICAgICAgY291bnQrKzsKICAgICAgfQogICAgICBwLT5uZXh0ID0gTlVMTDsKICAgICAgbWVyZ2Vfc29ydChoZWFkLG1pZCk7CiAgICAgIG1lcmdlX3NvcnQoJnRlbXAsbi1taWQpOwoKICAgICAgbWVyZ2UoaGVhZCx0ZW1wKTsKCgp9CgppbnQgbWFpbigpCnsKICAgICBzdHJ1Y3Qgbm9kZSAqaGVhZCA9IE5VTEw7CgogICAgIGludCBuOwogICAgIGNpbiA+PiBuOwoKICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBuOyBpKysgKXsKICAgICAgICBpbnQgeDsKICAgICAgICBjaW4gPj4geDsKICAgICAgICBpbnNlcnQoJmhlYWQseCk7CiAgICAgfQoKCiAgICAgbWVyZ2Vfc29ydCgmaGVhZCxuKTsKICAgICB0cmF2ZXJzZShoZWFkKTsKCn0KCg==