https://www.luogu.com.cn/problem/P1177
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 0x1000005
#define up(i,l,r) for(int i=l,E##i=r;i<=E##i;++i)
ll n;
ll a[N], t[N];
void srt( ll, ll );
int main() {
cin >> n;
up( i, 1, n ) cin >> a[i];
srt( 1, n );
up( i, 1, n ) cout << a[i] << " ";
}
void srt( ll l, ll r ) {
//边界条件
if ( l >= r ) return;
//递归
ll m = ( l + r ) >> 1;
thread lsrt( srt, l, m );
thread rsrt( srt, m + 1, r );
lsrt.join();
rsrt.join();
//合并
ll li = l, ri = m + 1, p = l;
while ( li <= m and ri <= r )
if( a[li] <= a[ri] ) t[p++] = a[li++];
else t[p++] = a[ri++];
up( i, li, m ) t[p++] = a[i]; //左边剩余
up( i, ri, r ) t[p++] = a[i]; //右边剩余
//迁移回原数组
up( i, l, r ) a[i] = t[i];
}