package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param data int整型一维数组 
 * @return int整型
*/
/*
*
本质上利用归并排序,实现分治
【关键】通过归并,统计左半边数组元素 > 右半边数组元素的的个数
*/
var (
	res  = 0
	base = 1000000007
)
func InversePairs( data []int ) int {
    // write code here
    arr := data
	if len(arr) == 0 {
		return res
	}
	sort(arr, 0, len(arr)-1)
	return res
}

func sort(arr []int, left, right int) {
	if left >= right {
		return
	}
	mid := left + (right-left)/2
	sort(arr, left, mid)
	sort(arr, mid+1, right)
	merge(arr, left, mid, right)
}

func merge(arr []int, left, mid, right int) {
	tmp := make([]int, 0)
	lIndex := left
	rIndex := mid + 1
	//统计左右边大小: 从小到大
	for lIndex <= mid && rIndex <= right {
		if arr[rIndex] < arr[lIndex] {
			tmp = append(tmp, arr[rIndex])
			rIndex++
			//【关键】通过归并,统计左半边数组元素 > 右半边数组元素的的个数
			res += mid - lIndex + 1
			res %= base
		} else {
			tmp = append(tmp, arr[lIndex])
			lIndex++
		}
	}
	//将剩余的加到后面
	for ; lIndex <= mid; lIndex++ {
		tmp = append(tmp, arr[lIndex])
	}
	for ; rIndex <= right; rIndex++ {
		tmp = append(tmp, arr[rIndex])
	}
	//将数据放回原来的位置
	for i := 0; i < len(tmp); i++ {
		arr[left] = tmp[i]
		left++
	}
}