#include <bits/stdc++.h>
using namespace std;
const int MX = 500005, mod = 1000000007;
int n, a[MX], q[MX];
long long res = 0;
struct FT {
  long long ft[MX];
  FT() { memset(ft, 0, sizeof(ft)); }
  void update(int i, int k) {
    while (i < MX) {
      (ft[i] += k) %= mod;
      i += i & -i;
    }
  }
  long long query(int i) {
    long long s = 0;
    while (i) {
      (s += ft[i]) %= mod;
      i -= i & -i;
    }
    return s;
  }
  long long query(int a, int b) {
    return (query(b) - query(a - 1) + mod) % mod;
  }
} izq, der;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  iota(q, q + n, 1);
  sort(q, q + n, [&](int i, int j) { return a[i] < a[j]; });
  for (int i = 0; i < n; i++) {
    int u = q[i];
    izq.update(u, u);
    long long acu = u * der.query(u, n) % mod;
    (acu += izq.query(1, u) * (n - u + 1)) %= mod;
    (res += a[u] * acu) %= mod;
    der.update(u, n - u + 1);
  }
  cout << ((((res) % (mod)) + (mod)) % (mod)) << endl;
  return 0;
}
