Peking University Online Judge 1990 MooFest

こちらはBinary Indexed Treeで。参照渡しが使えるとお利口さんに見えると思います。
類題:https://beta.atcoder.jp/contests/abc038/tasks/abc038_d

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
static const int MAX_N = 20000;
static const int MAX_X = 20000;

int N;
P p[MAX_N];

int bit1[MAX_X + 1], bit2[MAX_X + 1];

ll sum(int i, int *arr){
	ll res = 0;
	while(i > 0){
		res += arr[i];
		i -= i & -i;
	}
	return res;
}
void add(int i, int x, int *arr){
	while(i <= MAX_X){
		arr[i] += x;
		i += i & -i;
	}
	return ;
}

int main(){
	scanf("%d", &N);
	for(int i = 0; i < N; i++) scanf("%d %d", &p[i].first, &p[i].second);
	sort(p, p + N);
	
	ll res = 0LL;
	for(int i = 0; i < N; i++){
		ll sum_d = sum(MAX_X, bit1) - 2 * sum(p[i].second, bit1);
		sum_d += -(sum(MAX_X, bit2) - 2 * sum(p[i].second, bit2)) * p[i].second;
		res += p[i].first * sum_d;
		add(p[i].second, p[i].second, bit1);
		add(p[i].second, 1, bit2);
	}
	
	printf("%lld\n", res);
	return 0;
}