题目链接:https://ac.nowcoder.com/acm/contest/77/A?&headNav=www
题目大意:

如图:在4出现前,前面没有出现比4小的数的个数就是4对逆序对的贡献。
4出现, 比4小的数没有出现,那么(4, 1), (4, 2) (4, 3)都是逆序对。

5出现时,4已经出现那么 (5, 1), (5, 2) (5, 3)。

我们开一个权值数状数组。查询前缀和就可以了。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

int sum[100010]={0}, n=100010;
int a[100010]={0};

void add(int p, int y)
{
    while(p<=n)
    {
        sum[p]+=y;
        p+=(p&-p);
    }
}

int cx(int p)
{
    int ans=0;
    while(p)
    {
        ans+=sum[p];
        p-=(p&-p);
    }
    return ans;
}

int main()
{
    int n, m;
    LL ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        ans+=i-cx(a[i])-1;
        add(a[i], 1);
    }
    printf("%lld\n", ans);

    return 0;
}