#include <bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
const long long mod = 1e9 + 7;
struct BIT {
  long long tree[500111];
  int n;
  void init(int n) {
    int i;
    this->n = n;
    for (i = 0; i < 500111; ++i) tree[i] = 0;
  }
  int shift(int x) { return x & (-x); }
  void update(int x, long long val) {
    if (x <= 0) return;
    while (x <= n) {
      tree[x] += val;
      x += shift(x);
    }
  }
  long long query(int pos) {
    long long ret = 0;
    while (pos > 0) {
      ret += tree[pos];
      pos -= shift(pos);
    }
    return ret;
  }
};
BIT t;
long long num[500111];
vector<long long> disc;
long long coef[500111];
int idx(long long val) {
  return lower_bound(disc.begin(), disc.end(), val) - disc.begin() + 1;
}
long long mul(long long v1, long long v2) {
  long long ret = (v1 * v2) % mod;
  if (ret < 0) ret += mod;
  return ret;
}
long long add(long long v1, long long v2) {
  return ((v1 + v2) % mod + mod) % mod;
}
int main() {
  int i, n;
  long long ans = 0;
  scanf("%d", &n);
  t.init(n);
  for (i = 1; i <= n; ++i) {
    scanf("%I64d", &num[i]);
    disc.push_back(num[i]);
  }
  sort(disc.begin(), disc.end());
  for (i = 1; i <= n; ++i) {
    coef[i] = mul(t.query(idx(num[i])), n - i + 1);
    t.update(idx(num[i]), i);
  }
  t.init(n);
  for (i = n; i >= 1; --i) {
    coef[i] = add(coef[i], mul(t.query(idx(num[i])), i));
    t.update(idx(num[i]), n - i + 1);
    coef[i] = add(coef[i], 1ll * i * (n - i + 1));
  }
  for (i = 1; i <= n; ++i) {
    ans = add(ans, mul(coef[i], num[i]));
  }
  printf("%I64d\n", ans);
  return 0;
}
