func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   int pos[100005];   pair<int, long long> ai[4 * 100005];   void update_ai(int node, int l, int r, int pos, pair<int, long long> val) {     if (l == r) {       ai[node] = val;       return;     }     int mid = (l + r) >> 1;     if (pos <= mid)       update_ai(2 * node, l, mid, pos, val);     else       update_ai(2 * node + 1, mid + 1, r, pos, val);     ai[node].first = ai[2 * node].first + ai[2 * node + 1].first;     ai[node].second = ai[2 * node].second + ai[2 * node + 1].second;   }   void query_ai(int node, int l, int r, int lq, int rq,                 pair<int, long long> &ans) {     if (lq <= l && r <= rq) {       ans.first += ai[node].first;       ans.second += ai[node].second;       return;     }     int mid = (l + r) >> 1;     if (lq <= mid) query_ai(2 * node, l, mid, lq, rq, ans);     if (mid + 1 <= rq) query_ai(2 * node + 1, mid + 1, r, lq, rq, ans);   }   int main() {     scanf( %d , &n);     for (int i = 1; i <= n; ++i) {       int x;       scanf( %d , &x);       pos[x] = i;     }     double sol = 0;     for (int i = 1; i <= n; ++i) {       pair<int, long long> x = make_pair(0, 0);       query_ai(1, 1, n, 1, pos[i], x);       sol += ((double)(n - pos[i] + 1)) / n * (((double)x.second) / (n + 1));       x = make_pair(0, 0);       query_ai(1, 1, n, pos[i], n, x);       sol += x.first -              ((double)pos[i]) / n * (x.first - ((double)x.second) / (n + 1));       update_ai(1, 1, n, pos[i], make_pair(1, pos[i]));     }     printf( %.20f n , sol);     return 0;   }   