#include<iostream>
#include<cmath>
using namespace std;
int n;
void mergesort(int a[], int p, int r);
int *merge(int a[], int p, int q, int r);
int main() {
cout<<"Enter n: ";
cin>>n;
int a[n];
cout<<"Enter array "<<n<<" elements: ";
for(int i=0; i<n; i++) cin>>a[i];
mergesort(a,0,n-1);
for(int i=0; i<n; i++) cout<<a[i]<<" ";
cout<<endl;
return 0;
}
int *merge(int a[], int p, int q, int r) {
int lenb = q-p+1, lenc = r-q;
int b[lenb], c[lenc], indexb = 0, indexc = 0;
for(int i=0,j=p; i<lenb; i++,j++) b[i] = a[j];
for(int i=0,j=q+1; i<lenc; i++,j++) c[i] = a[j];
for(int k=p; k<=r; k++) {
if(indexb != lenb and indexc != lenc) {
if(b[indexb] < c[indexc]) {
a[k] = b[indexb];
indexb++;
} else {
a[k] = c[indexc];
indexc++;
}
} else {
if(indexb == lenb) {
a[k] = c[indexc];
indexc++;
} else {
a[k] = b[indexb];
indexb++;
}
}
}
return a;
}
void mergesort(int a[], int p, int r) {
if(p<r) {
int q = (p+r)/2;
mergesort(a,p,q);
mergesort(a,q+1,r);
merge(a,p,q,r);
}
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNtYXRoPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG47Cgp2b2lkIG1lcmdlc29ydChpbnQgYVtdLCBpbnQgcCwgaW50IHIpOwppbnQgKm1lcmdlKGludCBhW10sIGludCBwLCBpbnQgcSwgaW50IHIpOwoKaW50IG1haW4oKSB7CgogICAgY291dDw8IkVudGVyIG46ICI7CgljaW4+Pm47CglpbnQgYVtuXTsKCWNvdXQ8PCJFbnRlciBhcnJheSAiPDxuPDwiIGVsZW1lbnRzOiAiOwoKCWZvcihpbnQgaT0wOyBpPG47IGkrKykgY2luPj5hW2ldOwoJCgltZXJnZXNvcnQoYSwwLG4tMSk7CgkKCWZvcihpbnQgaT0wOyBpPG47IGkrKykgY291dDw8YVtpXTw8IiAiOwoJY291dDw8ZW5kbDsKCQoJcmV0dXJuIDA7Cn0KCgppbnQgKm1lcmdlKGludCBhW10sIGludCBwLCBpbnQgcSwgaW50IHIpIHsKCWludCBsZW5iID0gcS1wKzEsIGxlbmMgPSByLXE7CglpbnQgYltsZW5iXSwgY1tsZW5jXSwgaW5kZXhiID0gMCwgaW5kZXhjID0gMDsKCglmb3IoaW50IGk9MCxqPXA7IGk8bGVuYjsgaSsrLGorKykgYltpXSA9IGFbal07CgoJZm9yKGludCBpPTAsaj1xKzE7IGk8bGVuYzsgaSsrLGorKykgY1tpXSA9IGFbal07CgoJZm9yKGludCBrPXA7IGs8PXI7IGsrKykgewoJCWlmKGluZGV4YiAhPSBsZW5iIGFuZCBpbmRleGMgIT0gbGVuYykgewoJCQlpZihiW2luZGV4Yl0gPCBjW2luZGV4Y10pIHsKCQkJCWFba10gPSBiW2luZGV4Yl07CgkJCQlpbmRleGIrKzsKCQkJfSBlbHNlIHsKCQkJCWFba10gPSBjW2luZGV4Y107CgkJCQlpbmRleGMrKzsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmKGluZGV4YiA9PSBsZW5iKSB7CgkJCQlhW2tdID0gY1tpbmRleGNdOwoJCQkJaW5kZXhjKys7CgkJCX0gZWxzZSB7CgkJCQlhW2tdID0gYltpbmRleGJdOwoJCQkJaW5kZXhiKys7CgkJCX0KCQl9Cgl9CgkKCXJldHVybiBhOwp9CgoKdm9pZCBtZXJnZXNvcnQoaW50IGFbXSwgaW50IHAsIGludCByKSB7CglpZihwPHIpIHsKCQlpbnQgcSA9IChwK3IpLzI7CgkJbWVyZ2Vzb3J0KGEscCxxKTsKCQltZXJnZXNvcnQoYSxxKzEscik7CgkJbWVyZ2UoYSxwLHEscik7Cgl9Cn0K