#include using namespace std; const int MAXN = (int) 1e6 + 5; int a[MAXN]; int n; const int mod = (int) 1e9 + 7; long long stupid() { long long ans = 0; for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { for (int k = j + 1; k < n; k++) { for (int l = k; l < n; l++) { int mx = 0; for (int x = i; x <= j; x++) { mx = max(mx, a[x]); } int mn = (int) 1e9; for (int x = k; x <= l; x++) { mn = min(mn, a[x]); } ans += mx * (long long) mn; ans %= mod; } } } } return ans; } // O(n^2) vector calc_f() { vector f(n); for (int j = 0; j < n; j++) { int idx = -1; for (int i = j; i >= 0; i--) { if (a[i] > a[j]) { idx = i; break; } } f[j] = ((idx >= 0 ? f[idx] : 0) + (j - idx) * (long long) a[j] % mod) % mod; } return f; } // O(n) vector calc_f_smart() { vector f(n); stack > st; for (int j = 0; j < n; j++) { int idx = -1; while (!st.empty()) { if (st.top().first <= a[j]) { st.pop(); } else { idx = st.top().second; break; } } st.push(make_pair(a[j], j)); f[j] = ((idx >= 0 ? f[idx] : 0) + (j - idx) * (long long) a[j] % mod) % mod; } return f; } // O(n^2) vector calc_g() { vector g(n); for (int j = n - 1; j >= 0; j--) { int idx = n; for (int i = j; i < n; i++) { if (a[i] < a[j]) { idx = i; break; } } g[j] = ((idx < n ? g[idx] : 0) + (idx - j) * (long long) a[j]) % mod; } return g; } // O(n) vector calc_g_smart() { vector g(n); stack > st; for (int j = n - 1; j >= 0; j--) { int idx = n; while (!st.empty()) { if (st.top().first >= a[j]) { st.pop(); } else { idx = st.top().second; break; } } st.push(make_pair(a[j], j)); g[j] = ((idx < n ? g[idx] : 0) + (idx - j) * (long long) a[j]) % mod; } return g; } vector calc_suf_g(vector v) { vector res(n); for (int i = n - 1; i >= 0; i--) { res[i] = ((i + 1 < n ? res[i + 1] : 0) + v[i]) % mod; } return res; } long long smart() { vector f = calc_f(); vector g = calc_g(); vector suf_g = calc_suf_g(g); long long ans = 0; for (int j = 0; j + 1 < n; j++) { ans += f[j] * (long long) suf_g[j + 1] % mod; ans %= mod; } return ans; } long long smartest() { vector f = calc_f_smart(); vector g = calc_g_smart(); vector suf_g = calc_suf_g(g); long long ans = 0; for (int j = 0; j + 1 < n; j++) { ans = (ans + f[j] * suf_g[j + 1]) % mod; } return ans; } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } //long long stupid_ans = stupid(); //printf("%lld\n", stupid_ans); //long long s_ans = smart(); //printf("%lld\n", s_ans); long long smartest_ans = smartest(); printf("%lld\n", smartest_ans); return 0; }