#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;
}
