#include #include using namespace std; int N, a[2000000]; //long long inversions; void input() { scanf("%d", &N); for( int i = 0; i < N; i++ ) scanf("%d", &a[i]); } /*int b[2000000], c[2000000]; void merge( int left, int right ) { int mid = (left+right)/2; int cnt_b = 0, cnt_c = 0; for( int i = left; i <= mid; i++ ) b[cnt_b++] = a[i]; for( int i = mid+1; i <= right; i++ ) c[cnt_c++] = a[i]; int k1 = 0, k2 = 0; int k = left; while( k1 < cnt_b && k2 < cnt_c ) { if( b[k1] < c[k2] ) a[k++] = b[k1++]; else { a[k++] = c[k2++]; //inversions += cnt_b-k1; } } while( k1 < cnt_b ) a[k++] = b[k1++]; while( k2 < cnt_c ) a[k++] = c[k2++]; }*/ int b[2000000]; void betterMerge( int left, int right ) { int k = 0; int mid = (left+right)/2; int i = left, j = mid+1; while( i <= mid && j <= right ) { if( a[i] < a[j] ) b[k++] = a[i++]; else { b[k++] = a[j++]; //inversions += (long long)(mid-i+1); } } while( i <= mid ) b[k++] = a[i++]; while( j <= right ) b[k++] = a[j++]; for( int i = left; i <= right; i++ ) a[i] = b[i-left]; } void mergeSort( int left, int right ) { if( right-left <= 0 ) return; if( right-left == 1 ) { if( a[left] > a[right] ) { swap(a[left], a[right]); //inversions++; } return; } int mid = (left+right)/2; mergeSort(left, mid); mergeSort(mid+1, right); //merge(left, right); betterMerge(left, right); } void print() { for( int i = 0; i < N; i++ ) printf("%d ", a[i]); printf("\n"); //printf("Number of inversions is: %lld\n", inversions); } int main() { input(); mergeSort(0, N-1); print(); return 0; }