#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; class BIT{ /*binary indexed tree*/ private: vector data; int size; public: BIT(int n): data(n+1,0),size(n){ return; } int sum(int l, int r ){ // return sum in [l+1,r] or (l,r] return sum_(r)-sum_(l); } int sum_(int i){ // return sum (0, i] int ans = 0; while( 0 < i ){ ans += data[i]; i -= i&-i; // 11010110 -> 1010100 } return ans; } void add(int i, int x){ // add x to i while( i <= size ){ data[i] += x; i+= i&-i; } return; } }; int main(){ int N; cin >> N; vector A(N,0); for( int i = 0; i> A[i]; vector V=A; sort(V.begin(),V.end()); V.erase(unique(V.begin(),V.end()),V.end()); map unZip; int Vsize=V.size(); for( int i = 0 ; i<(int)V.size(); i++){ unZip[V[i]]=i+1; } long long ans = 0; { vector sameArray[Vsize+1]; for( int i = 0 ; i < N; i++){ sameArray[unZip[A[i]]].push_back(i); } for( int i = 0 ; i <= Vsize; i++){ for( int j = 0 ; j+1 < (int)sameArray[i].size(); j++ ){ long long l=j+1; long long r = (int)sameArray[i].size()-l; ans-= l*r*(sameArray[i][j+1]-sameArray[i][j]-1); } } } BIT left(Vsize); BIT right(Vsize); for( int i = 0 ; i < N; i++){ right.add(unZip[A[i]],1); } for( int i = 0 ; i