# include /// my holy template # define F first # define S second # define mp make_pair # define pii pair /// eveything goes according to my plan # define long long long # define pb push_back # define sz(a) (int)(a.size()) # define vec vector /// countdown BEGAN. 10 , 9 , 8 ... # define y1 Y_U_NO_y1 # define left Y_U_NO_left # define right Y_U_NO_right /// dzyn dzyn dzyn const int Mod = (int)1e9 + 7; const int MX = 1073741822; const long MXLL = 9223372036854775807; const int Sz = 1110111; using namespace std; inline void Read_rap () { ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0); } inline void randomizer3000 () { unsigned int seed; asm("rdtsc" : "=A"(seed)); srand(seed); } int n; int a[Sz]; struct data { long sum; int mx; }; data pref[Sz], suff[Sz]; long solve1() { vec st; vec l(n + 1), r(n + 1); for (int i = 1; i <= n; i++) { l[i] = i; while (!st.empty() && a[st.back()] < a[i]) { l[i] = l[st.back()]; st.pop_back(); } st.pb (i); } st.clear(); for (int i = n; i >= 1; i--) { r[i] = i; while (!st.empty() && a[st.back()] <= a[i]) { r[i] = r[st.back()]; st.pop_back(); } st.pb (i); } vec S(n + 1); for (int i = 1; i <= n; i++) { S[i] = (S[i - 1] + i * 1ll * (i + 1) / 2) % Mod; } long ans = 0; for (int i = 1; i <= n; i++) { int x = (i - l[i] + 1); int y = (r[i] - i + 1); long cnt = (S[x + y - 1] - S[y - 1] - S[x - 1] + 2*Mod) % Mod; ans = (ans + cnt * a[i]) % Mod; } return ans; } long solve2() { long mx = *max_element (a + 1, a + n + 1); long ans = 0; for (long cnt = n; cnt >= 3; cnt--) { ans = (ans + cnt * ((cnt-2) * (cnt-1) / 2)) % Mod; } ans = (ans * mx) % Mod; return ans; } long solve3() { long ans = 0; long cur = 0; cur = pref[n].mx * 2; for (int cnt = 2; cnt <= n; cnt++) { ans = (ans + cur) % Mod; if (cnt == n) continue; int l = n - cnt + 2, r = n, id = n - cnt + 1; long nw = suff[cnt + 1].mx; while (l <= r) { int mid = (l+r) >> 1; if (pref[mid].mx < nw) { id = mid; l = mid + 1; } else r = mid - 1; } cur = (cur + pref[n].sum - pref[id].sum) % Mod; cur = (cur + nw * (id - (n - cnt + 2) + 1)) % Mod; l = 1, r = cnt + 1, id = cnt+2; nw = pref[n - cnt + 1].mx; while (l <= r) { int mid = (l+r) >> 1; if (suff[mid].mx < nw) { id = mid; r = mid - 1; } else l = mid + 1; } cur = (cur + nw * (cnt - id + 2)) % Mod; cur = (cur + suff[1].sum - suff[id].sum) % Mod; } return ans; } /* const int N = 1e3 + 1; int mx[N][N]; long solve_slow() { vec b; for (int i = 1; i <= n; i++) for (int j = i; j <= n; j++) mx[i][j] = max (mx[i][j - 1], a[j]); for (int len = 0; len < n; len++) { for (int i = 1; i + len <= n; i++) { int j = i + len; b.pb (mx[i][j]); } } long ans = 0; for (int i = 0; i < sz(b); i++) { int mx = 0; for (int j = i; j < sz(b); j++) { mx = max (mx, b[j]); ans = (ans + mx) % Mod; } } return ans; } */ int main() { Read_rap (); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) { pref[i].mx = max (pref[i - 1].mx, a[i]); pref[i].sum = pref[i - 1].sum + pref[i].mx; } for (int i = n; i >= 1; i--) { suff[i].mx = max (suff[i + 1].mx, a[i]); suff[i].sum = suff[i + 1].sum + suff[i].mx; } long ans = 0; ans = (ans + solve1()) % Mod; ans = (ans + solve2()) % Mod; ans = (ans + solve3()) % Mod; cout << ans; return 0; } // Coded by Z...