POJ2299-Ultra-QuickSort
http://poj.org/problem?id=2299
#include<stdio.h> int a[500002],left[250001],right[250001]; __int64 count; void merge(int a[],int l,int m,int r) { int i,j,k,n1,n2; n1=m-l+1; n2=r-m; for(i=0;i<n1;i++) left[i]=a[l+i]; for(i=0;i<n2;i++) right[i]=a[m+1+i]; left[n1]=right[n2]=0x7fffffff; i=j=0; for(k=l;k<=r;k++) { if(left[i]<=right[j]) a[k]=left[i++]; else { a[k]=right[j++]; count+=n1-i; } } } void mergesort(int a[],int l,int r) { if(l<r) { int m=l+r>>1; mergesort(a,l,m); mergesort(a,m+1,r); merge(a,l,m,r); } } int main(void) { int n,i; while(scanf("%d",&n),n) { count=0; for(i=0;i<n;i++) scanf("%d",&a[i]); mergesort(a,0,n-1); printf("%I64d\n",count); } return 0; }