Need two tree array to get answer;
The portal:http://poj.org/problem?id=1990
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
const long long M = 20005;
struct Cows {
long long value;
long long position;
bool operator < (const Cows & a1) const {
return a1.value > value;
}
}cows[M];
long long Bit_num[2][M+5];
void Insert(long long x,long long value,long long flag) {
for(long long i = x ; i <= M ; i += i & -i) {
Bit_num[flag][i] += value;
}
}
long long Query(long long x,long long flag) {
long long ret = 0;
for(long long i = x ; i ; i -= i & -i) {
ret += Bit_num[flag][i];
}
return ret;
}
void Deal_with() {
long long n;
while(~scanf("%lld",&n)){
memset(Bit_num,0,sizeof(Bit_num));
for(long long i=1 ; i <= n ; i++) {
scanf("%lld %lld",&cows[i].value,&cows[i].position);
}
sort(cows+1,cows+n+1);
long long ans = 0;
for(long long i=1 ; i <= n ; i++) {
long long a = Query(cows[i].position,0);
long long b = Query(cows[i].position,1);
long long c = Query(M,1);
ans += cows[i].value * (cows[i].position * a - b +
c - b - (i - a - 1) * cows[i].position) ;
Insert(cows[i].position,cows[i].position,1);
Insert(cows[i].position,1,0);
}
printf("%lld\n",ans);
}
}
int main(void) {
//freopen("a.in","r",stdin);
Deal_with();
return 0;
}