func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long mod = 1e9 + 7;   const int N = 5e5 + 2;   const int M = 1e5 + 2;   const int inf = 2e9 + 2;   const long long linf = 4e18 + 2;   long long add(long long a, long long b) {     a += b;     return a >= mod ? a - mod : a;   }   long long sub(long long a, long long b) {     a += mod - b;     return a >= mod ? a - mod : a;   }   long long mul(long long a, long long b) { return (long long)a * b % mod; }   long long a[N], bit[2][N];   long long id[N];   bool cmp(long long c, long long d) { return a[c] < a[d]; }   void upd(int x, int val, int s) {     for (; x < N; x += x & (-x)) bit[s][x] += val;   }   long long get(int x, int s) {     long long ans = 0;     for (; x > 0; x -= x & (-x)) ans += bit[s][x];     return ans;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     int n;     cin >> n;     for (int i = 1; i <= n; i++) cin >> a[i], id[i] = i;     sort(id + 1, id + 1 + n, cmp);     long long ans = 0;     for (int j = 1; j <= n; j++) {       int i = id[j];       ans = add(ans, mul(a[i], mul(i, n - i + 1)));       long long l = get(i, 0);       long long r = get(n, 1) - get(i, 1);       ans = add(ans, mul(a[i], mul(l, n - i + 1)));       ans = add(ans, mul(a[i], mul(r, i)));       upd(i, i, 0);       upd(i, n - i + 1, 1);     }     cout << ans <<   n ;     return 0;   }   