package main
import (
"fmt"
)
func main() {
num := 0
for {
n, _ := fmt.Scan(&num)
if n == 0 {
break
} else {
arr := make([]int, num)
for i:=0; i<num; i++ {
fmt.Scan(&arr[i])
}
fmt.Println(process(arr,0, len(arr)-1))
}
}
}
// 计算小数和,转换问题为,
// 在位置i处,arr[i] 右边大于等于arr[i]的数有多少个, 假设有N个
// sum += arr[i] * N
// 联想到归并排序,部分有序,左边找右边有多少个数大于这个数,累加求和。
func process(arr []int,l, r int) int{
if l >= r {
return 0
}
mid := (r-l)/2+l
sum1 := process(arr, l, mid)
sum2 := process(arr, mid+1, r)
return sum1+sum2+merge(arr, l, mid, r)
}
func merge(arr []int, l, mid, r int) int{
tmp := make([]int, r-l+1)
li, rj := l, mid+1
sum := 0
i := 0
for li <= mid && rj<=r {
if arr[li] <= arr[rj] {
tmp[i] = arr[li]
sum += arr[li] * (r-rj+1) // 在位置i处,arr[i] 右边大于等于arr[i]的数有r-rj+1个
li++
} else {
tmp[i] = arr[rj]
rj++
}
i++
}
for li <= mid {
tmp[i] = arr[li]
li++
i++
}
for rj <= r {
tmp[i] = arr[rj]
rj++
i++
}
for i:=0; i<len(tmp); i++ {
arr[l+i] = tmp[i]
}
return sum
}