#include <bits/stdc++.h>   using namespace std;   struct InputReader {     char buf[1000001];     int p;     inline InputReader() { p = 1000001; }     inline void Flush() {       p = 0;       fread(buf, 1, 1000001, stdin);     }     inline char C() {       if (p >= 1000001) Flush();       return buf[p++];     }     inline char Readnum() {       char ch = C();       while (!isdigit(ch) && ch !=  - ) ch = C();       return ch;     }     inline void Readalpha(char &c) {       c = C();       while (!isalpha(c)) c = C();     }     int operator()() {       int ans = 0, fu = 1;       char ch = Readnum();       if (ch ==  - ) fu = -1, ch = C();       while (ch >=  0  && ch <=  9 ) {         ans = ans * 10 + ch -  0 ;         ch = C();       }       return ans * fu;     }     long long Readll() {       long long ans = 0LL, fu = 1LL;       char ch = Readnum();       if (ch ==  - ) fu = -1LL, ch = C();       while (ch >=  0  && ch <=  9 ) {         ans = ans * 10LL + ch -  0 ;         ch = C();       }       return ans * fu;     }     inline void Readstring(string &x) {       x.clear();       char ch = C();       while (!isdigit(ch) && !isalpha(ch) && ch !=  #  && ch !=  . ) ch = C();       while (isdigit(ch) || isalpha(ch) || ch ==  #  || ch ==  . ) {         x += ch;         ch = C();       }     }     inline void Readchstring(char s[]) {       int len = 0;       char ch = C();       while (!isdigit(ch) && !isalpha(ch)) ch = C();       while (isdigit(ch) || isalpha(ch)) {         s[len++] = ch;         ch = C();       }       s[len] =   0 ;     }     inline void Specialread(char &c) {       c = C();       while (!isdigit(c) && !isalpha(c) && c !=  #  && c !=  .  && c !=  =  &&              c !=  B )         c = C();     }   } In;   inline void Read(int &x) { x = In(); }   inline void Read(int &x, int &y) {     x = In();     y = In();   }   inline void Read(int &x1, int &x2, int &x3) {     x1 = In();     x2 = In();     x3 = In();   }   inline void Read(int &x1, int &x2, int &x3, int &x4) {     x1 = In();     x2 = In();     x3 = In();     x4 = In();   }   inline void Read(long long &x) { x = In.Readll(); }   inline void Read(long long &x, long long &y) {     x = In.Readll();     y = In.Readll();   }   inline void Read(long long &x1, long long &x2, long long &x3) {     x1 = In.Readll();     x2 = In.Readll();     x3 = In.Readll();   }   inline void Read(long long &x1, long long &x2, long long &x3, long long &x4) {     x1 = In.Readll();     x2 = In.Readll();     x3 = In.Readll();     x4 = In.Readll();   }   template <typename T>   void Read(T a[], int st, int ed) {     for (int(i) = (st); (i) <= (ed); ++(i)) Read(a[i]);   }   inline void FILEIO() {}   inline void FILEIO(string pname) {     freopen((pname +  .in ).c_str(),  r , stdin);     freopen((pname +  .out ).c_str(),  w , stdout);   }   inline void FILEIO_OICONTEST(string pname) {     freopen((pname +  .in ).c_str(),  r , stdin);     freopen((pname +  .out ).c_str(),  w , stdout);   }   void Printtime() {}   void END() {     Printtime();     exit(0);   }   template <typename T>   void END(T mes) {     cout << mes << endl;     END();   }   template <typename T>   void Print(T a[], int s, int t, char sp =    , char ed =   n ) {     if (s > t) return;     for (int i = s; i < t; i++) cout << a[i] << sp;     cout << a[t] << ed;     cout.flush();   }   template <typename T>   void Print(T a, int s = 0, int t = -1, char sp =    , char ed =   n ) {     if (t == -1) t = a.size() - 1;     for (int i = s; i <= t; i++) cout << a[i] << sp;     cout << ed;     cout.flush();   }   long long Pow(long long a, long long b, long long p = (1000000007LL)) {     long long ret = 1;     for (; b; a = a * a % p, b >>= 1LL)       if (b & 1LL) ret = ret * a % p;     return ret;   }   long long Inv(long long a, long long p = (1000000007LL)) {     return Pow(a, p - 2LL, p);   }   int n;   long long a[524288], va[524288];   long long lowerl[524288], lowerr[524288];   long long tree[524288];   inline void Add(int pos, long long x) {     assert(pos <= n + 1);     for (; pos <= n; pos += ((pos) & (-pos))) {       tree[pos] += x;       tree[pos] = (tree[pos]) >= (1000000007LL) ? ((tree[pos]) - (1000000007LL))                                                 : (tree[pos]);     }   }   inline long long Sum(int pos) {     long long ans = 0;     for (; pos; pos -= ((pos) & (-pos))) {       ans += tree[pos];       ans = (ans) >= (1000000007LL) ? ((ans) - (1000000007LL)) : (ans);     }     return ans;   }   void CalcLowerL() {     memset(tree, 0, sizeof(tree));     for (int(i) = 1; (i) <= (n); ++(i)) {       lowerl[i] = Sum(va[i] - 1);       Add(va[i], i);     }   }   void CalcLowerR() {     memset(tree, 0, sizeof(tree));     for (int(i) = (n); (i) >= 1; --(i)) {       lowerr[i] = Sum(va[i] - 1);       Add(va[i], n - i + 1);     }   }   int main() {     FILEIO();     Read(n);     vector<long long> d;     d.clear();     for (int(i) = 1; (i) <= (n); ++(i)) {       Read(a[i]);       d.push_back(a[i]);     }     sort(d.begin(), d.end());     d.resize(unique(d.begin(), d.end()) - d.begin());     for (int(i) = 1; (i) <= (n); ++(i)) {       va[i] = lower_bound(d.begin(), d.end(), a[i]) - d.begin() + 1;     }     CalcLowerL();     CalcLowerR();     long long ans = 0;     for (int(i) = 1; (i) <= (n); ++(i)) {       ans += 1LL * a[i] * i % (1000000007LL) * (n - i + 1) % (1000000007LL);       ans = (ans) >= (1000000007LL) ? ((ans) - (1000000007LL)) : (ans);     }     for (int(i) = 1; (i) <= (n); ++(i)) {       long long tans = (n - i + 1) * lowerl[i] + i * lowerr[i];       tans %= (1000000007LL);       tans = tans * a[i] % (1000000007LL);       ans += tans;       ans = (ans) >= (1000000007LL) ? ((ans) - (1000000007LL)) : (ans);     }     cout << ans << endl;     END();   }