In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 – the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
Sample Input
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define int long long
using namespace std;
const int N=500050;
int a[N],b[N];
int t[N];
void add(int k)
{
for(int i=k;i<=N;i+=(i&-i))
{
t[i]++;
}
}
int read(int k)
{
int sum=0;
for(int i=k;i;i-=(i&-i))
{
sum+=t[i];
}
return sum;
}
signed main()
{
int n;
while(scanf("%lld",&n),n)
{
memset(t,0,sizeof(t));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1);
unique(b+1,b+n+1);
for(int i=1;i<=n;i++)
{
a[i]=lower_bound(b+1,b+n+1,a[i])-(b);
}
int sum=0;
for(int i=1;i<=n;i++)
{
int q=read(a[i]);
sum+=(i-1-q);
add(a[i]);
}
printf("%lld\n",sum);
}
return 0;
}
#include <stdio.h>
#include <algorithm>
#define int long long
using namespace std;
int h;
int a[500500];
int b[500500];
void hebin(int l,int mid,int r)
{
int i=l,j=mid+1;
int k=0;
while(i<=mid&&j<=r)
{
if(a[i]<=a[j])
{
b[k++]=a[i];
i++;
}
else
{
b[k++]=a[j];
j++;
h+=(mid-i+1);
}
}
while(i<=mid)
{
b[k++]=a[i];
i++;
}
while(j<=r)
{
b[k++]=a[j];
j++;
}
for(i=0;i<k;i++)
{
a[l+i]=b[i];
}
}
void m_sort(int l,int r)
{
if(l<r)
{
int mid=(l+r)/2;
m_sort(l,mid);
m_sort(mid+1,r);
hebin(l,mid,r);
}
}
signed main()
{
int n;
while(scanf("%lld",&n),n)
{
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
h=0;
m_sort(1,n);
printf("%lld\n",h);
}
return 0;
}