#include<bits/stdc++.h>
using namespace std;
#define MAX_n 1000000
int temp[MAX_n];
int a[MAX_n];
void merge_sort(int a[MAX_n], int left, int right) {
if(left >= right) return;//Khi dãy được xét chỉ có tối đa 1 phần tử, bỏ qua
int mid = (left + right) / 2;//Lấy biến mid làm mốc để chia đôi dãy
//Lần lượt sắp xếp 2 nửa trái - phải của dãy to
merge_sort(a, left, mid);
merge_sort(a, mid + 1, right);
int i = left, j = mid + 1;//Lưu vị trí của phần tử đang xét trong 2 dãy con
int curr = 0;//Lưu ô trống muốn đưa vào dãy temp
while((i <= mid) || (j <= right)) {/*Dừng lại khi i > mid VÀ j > right, tức là
cả 2 dãy không còn phần tử nào cần sắp xếp*/
if(i > mid) {//Nếu dãy trái không còn phần tử, đưa phần tử của dãy phải vào
temp[curr] = a[j];
curr++;
j++;
} else if (j > right){//Tương tự, nếu dãy phải không còn phần tử,...
temp[curr] = a[i];
curr++;
i++;
} else if(a[i] < a[j]) {/*Khi cả 2 dãy còn phần tử, nếu phần tử đang xét
của dãy trái nhỏ hơn phần tử của dãy phải,...*/
temp[curr] = a[i];
curr++;
i++;
} else {//Nếu phần tử đang xét của dãy phải nhỏ hơn...
temp[curr] = a[j];
curr++;
j++;
}
}
//Đưa các phần tử đã được sắp xếp trong dãy temp về đúng vị trí trong dãy a
for(int i = 0; i < curr; i++) a[left + i] = temp[i];
}
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
// S?p x?p g?p - Merge Sort
merge_sort(a, 0, n - 1);
for(int i = 0; i < n; i++) cout << a[i] << " ";
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBNQVhfbiAxMDAwMDAwCgppbnQgdGVtcFtNQVhfbl07CmludCBhW01BWF9uXTsKCnZvaWQgbWVyZ2Vfc29ydChpbnQgYVtNQVhfbl0sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKCQoJaWYobGVmdCA+PSByaWdodCkgcmV0dXJuOy8vS2hpIGTDo3kgxJHGsOG7o2MgeMOpdCBjaOG7iSBjw7MgdOG7kWkgxJFhIDEgcGjhuqduIHThu60sIGLhu48gcXVhCgkKCWludCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7Ly9M4bqleSBiaeG6v24gbWlkIGzDoG0gbeG7kWMgxJHhu4MgY2hpYSDEkcO0aSBkw6N5CgkKCS8vTOG6p24gbMaw4bujdCBz4bqvcCB44bq/cCAyIG7hu61hIHRyw6FpIC0gcGjhuqNpIGPhu6dhIGTDo3kgdG8KCW1lcmdlX3NvcnQoYSwgbGVmdCwgbWlkKTsKCW1lcmdlX3NvcnQoYSwgbWlkICsgMSwgcmlnaHQpOwoJCglpbnQgaSA9IGxlZnQsIGogPSBtaWQgKyAxOy8vTMawdSB24buLIHRyw60gY+G7p2EgcGjhuqduIHThu60gxJFhbmcgeMOpdCB0cm9uZyAyIGTDo3kgY29uCglpbnQgY3VyciA9IDA7Ly9MxrB1IMO0IHRy4buRbmcgbXXhu5FuIMSRxrBhIHbDoG8gZMOjeSB0ZW1wCgl3aGlsZSgoaSA8PSBtaWQpIHx8IChqIDw9IHJpZ2h0KSkgey8qROG7q25nIGzhuqFpIGtoaSBpID4gbWlkIFbDgCBqID4gcmlnaHQsIHThu6ljIGzDoAoJCQkJCQkJCQkJY+G6oyAyIGTDo3kga2jDtG5nIGPDsm4gcGjhuqduIHThu60gbsOgbyBj4bqnbiBz4bqvcCB44bq/cCovCgkJaWYoaSA+IG1pZCkgey8vTuG6v3UgZMOjeSB0csOhaSBraMO0bmcgY8OybiBwaOG6p24gdOG7rSwgxJHGsGEgcGjhuqduIHThu60gY+G7p2EgZMOjeSBwaOG6o2kgdsOgbwoJCQl0ZW1wW2N1cnJdID0gYVtqXTsKCQkJY3VycisrOwoJCQlqKys7CgkJfSBlbHNlIGlmIChqID4gcmlnaHQpey8vVMawxqFuZyB04buxLCBu4bq/dSBkw6N5IHBo4bqjaSBraMO0bmcgY8OybiBwaOG6p24gdOG7rSwuLi4KCQkJdGVtcFtjdXJyXSA9IGFbaV07CgkJCWN1cnIrKzsKCQkJaSsrOwoJCX0gZWxzZSBpZihhW2ldIDwgYVtqXSkgey8qS2hpIGPhuqMgMiBkw6N5IGPDsm4gcGjhuqduIHThu60sIG7hur91IHBo4bqnbiB04butIMSRYW5nIHjDqXQKCQkJCQkJCQlj4bunYSBkw6N5IHRyw6FpIG5o4buPIGjGoW4gcGjhuqduIHThu60gY+G7p2EgZMOjeSBwaOG6o2ksLi4uKi8KCQkJdGVtcFtjdXJyXSA9IGFbaV07CgkJCWN1cnIrKzsKCQkJaSsrOwoJCX0gZWxzZSB7Ly9O4bq/dSBwaOG6p24gdOG7rSDEkWFuZyB4w6l0IGPhu6dhIGTDo3kgcGjhuqNpIG5o4buPIGjGoW4uLi4KCQkJdGVtcFtjdXJyXSA9IGFbal07CgkJCWN1cnIrKzsKCQkJaisrOwoJCX0KCX0KCS8vxJDGsGEgY8OhYyBwaOG6p24gdOG7rSDEkcOjIMSRxrDhu6NjIHPhuq9wIHjhur9wIHRyb25nIGTDo3kgdGVtcCB24buBIMSRw7puZyB24buLIHRyw60gdHJvbmcgZMOjeSBhCglmb3IoaW50IGkgPSAwOyBpIDwgY3VycjsgaSsrKSBhW2xlZnQgKyBpXSA9IHRlbXBbaV07Cn0KCgppbnQgbWFpbigpIHsKCWludCBuOwoJY2luID4+IG47Cglmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBjaW4gPj4gYVtpXTsKCQovLwlTP3AgeD9wIGc/cCAtIE1lcmdlIFNvcnQKCW1lcmdlX3NvcnQoYSwgMCwgbiAtIDEpOwoKCWZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspIGNvdXQgPDwgYVtpXSA8PCAiICI7Cn0=