func_code_string: #include <bits/stdc++.h>   using namespace std;   class ST {    private:     vector<long long> st;     int n;     int left(int p) { return p << 1; }     int right(int p) { return left(p) + 1; }     int query(int p, int L, int R, int i) {       if (L > i) return 0;       if (R <= i) return st[p];       return query(left(p), L, (L + R) >> 1, i) +              query(right(p), ((L + R) >> 1) + 1, R, i);     }     int update(int p, int L, int R, int idx) {       if (L > idx || R < idx) return st[p];       if (L == R) {         return ++st[p];       }       return st[p] = update(left(p), L, (L + R) >> 1, idx) +                      update(right(p), ((L + R) >> 1) + 1, R, idx);     }       public:     ST(int _n) {       n = _n;       st.assign(4 * n, 0);     }     int query(int i) {       int ret = query(1, 0, n - 1, i);       update(i);       return ret;     }     void update(int idx) { update(1, 0, n - 1, idx); }   };   int main() {     int n;     map<long long, long long> mp;     long long ans = 0;     scanf( %I64d , &n);     vector<long long> vec(n), vec2(n);     for (long long i = 0; i < n; i++) scanf( %I64d , &vec[i]), vec2[i] = vec[i];     ST st(n);     sort(vec2.begin(), vec2.end());     for (long long i = 0; i < n; i++) mp[vec2[i]] = i;     for (long long i = 0; i < n - 1; i++) {       long long q = st.query(mp[vec[i]]);       ans += (i - q) * (mp[vec[i]] - q);     }     printf( %I64d , ans);     return 0;   }   