#include "math.h" #include #include #include #include #include #include #include #include #include #define ifor(i, a, b) for (int i = (a); i < (b); i++) #define rfor(i, a, b) for (int i = (b)-1; i >= (a); i--) #define rep(i, n) for (int i = 0; i < (n); i++) #define rrep(i, n) for (int i = (n)-1; i >= 0; i--) using namespace std; typedef long double ld; typedef long long int lli; typedef complex P; const double eps = 1e-11; int vex[4] = {1, 0, -1, 0}; int vey[4] = {0, 1, 0, -1}; typedef vector Vec; typedef vector vec; typedef vector MAT; typedef vector mat; lli MOD = 1000000007; template class bit { public: vector dat; int n; bit(int n) : n(n) { dat.assign(n, 0); } bit(int n, T ini) : n(n) { dat.assign(n, ini); } // sum [0,i) T sum(int i) { int ret = 0; for (--i; i >= 0; i = (i & (i + 1)) - 1) ret += dat[i]; return ret; } // sum [i,j) T sum(int i, int j) { return sum(j) - sum(i); } // add x to i void add(int i, T x) { for (; i < n; i |= i + 1) dat[i] += x; } }; lli n; lli solve(vector a, lli x) { rep(i, n) { a[i] *= x; } bit b(n + 20); map loop; vector> d; rep(i, n) { d.push_back(make_pair(a[i], i)); loop[a[i]]++; } sort(d.begin(), d.end()); //a_jが中心でa_i,a_jとなるものを考える. lli ans = 0; rep(j, n) { //cout << "LOOP" << j << endl; lli num = d[j].first; //cout << num << endl; vector ins; rep(l, loop[num]) { lli in = d[j].second; lli left = b.sum(0, in); lli right = b.sum(in, n + 10); ans += left * right; ins.push_back(in); j++; } j--; for (auto k : ins) { b.add(k, 1); } } // ここまででa_i == a_jも含めたものができた. return ans; } int main() { cin >> n; vector a(n); rep(i, n) cin >> a[i]; //座標圧縮 vector b(a), left(n, 0), right(n, 0); sort(b.begin(), b.end()); b.erase(unique(b.begin(), b.end()), b.end()); rep(i, n) { a[i] = lower_bound(b.begin(), b.end(), a[i]) - b.begin(); right[a[i]]++; } lli ans = solve(a, 1); ans += solve(a, -1); lli sum = 0; rep(i, n) { } rep(i, n) { sum -= left[a[i]] * right[a[i]]; ans -= sum; left[a[i]]++; right[a[i]]--; sum += left[a[i]] * right[a[i]]; } cout << ans << endl; }