/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param data int整型一维数组 
 * @param dataLen int data数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
static unsigned int count = 0;
void merge(int *arr, int lo, int mid, int hi);
void mergeSort(int *arr,int lo, int hi)
{
    if(lo == hi) return;
    int mid = (hi +lo) >> 1;
    mergeSort(arr, lo, mid);
    mergeSort(arr ,mid +1, hi);
    merge(arr,lo, mid, hi);
}
void merge(int *arr,int lo, int mid, int hi)
{
    int *B = (int*)malloc((mid - lo +1) * sizeof(int));
    int i,j,k;
    for(i = lo, j = 0; i <= mid; i++)
    {
        *(B + (j++)) = *(arr + i);
    }
    for(i = 0, k = lo, j = mid + 1;i <= mid - lo;)
    {
        if(*(B + i) > *(arr + j) && j <= hi)
        {
            count = count +(mid - lo - i + 1);
            *(arr + (k ++)) = *(arr + (j ++));
        }
        else
        {
            *(arr + (k ++)) = *(B + (i ++));
        }
        //*(arr + (k ++)) = *(B + i) < *(arr + j) || j > hi ? *(B + (i ++)) : *(arr + (j ++));
    }
    free(B);
    count = count % 1000000007;
}
int InversePairs(int* data, int dataLen ) {

    mergeSort(data, 0, dataLen - 1);
    return count;
}