/*input 6 3 1000000006 1000000006 1000000006 1000000006 1000000006 */ #include using namespace std; int main () { const long long mod = 1000000007; long long n; cin >> n; long long a[n]; long long ma = 0; for (int i = 0; i < n; i++) { cin >> a[i]; ma = max(ma, a[i]); } long long buvdid[n]; long long sekdid[n]; stack s; s.push(0); for (int i = 1; i < n; i++) { if (!s.empty()) { int in = s.top(); s.pop(); while (a[in] < a[i]) { sekdid[in] = i; if (s.empty()) break; in = s.top(); s.pop(); } if (a[in] >= a[i]) s.push(in); } s.push(i); } while (!s.empty()) { sekdid[s.top()] = n; s.pop(); } s.push(n - 1); for (int i = n; i >= 0; i--) { if (!s.empty()) { int in = s.top(); s.pop(); while (a[in] <= a[i]) { buvdid[in] = i; if (s.empty()) break; in = s.top(); s.pop(); } if (a[in] > a[i]) s.push(in); } s.push(i); } while (!s.empty()) { buvdid[s.top()] = -1; s.pop(); } /*for (int i = 0; i < n; i++) cout << sekdid[i] << " "; cout << endl; for (int i = 0; i < n; i++) cout << buvdid[i] << " "; cout << endl;*/ long long ats = 0; for (long long i = 0; i < n; i++) { ats += (a[i] * ((((sekdid[i] - buvdid[i]) * 500000004) % mod) * (((i - buvdid[i]) * (sekdid[i] - i)) % mod) % mod)) % mod; if (buvdid[i] == -1 and sekdid[i] == n) ats -= (a[i] * n) % mod; ats %= mod; } long long pra[n + 1]; long long pab[n + 1]; pra[0] = pab[0] = 0; for (int i = 0; i < n; i++) { pra[i + 1] = max(pra[i], a[i] * 1ll); pab[i + 1] = max(pab[i], a[n - 1 - i] * 1ll); } /*for (int i = 0; i <= n; i++) cout << pra[i] << " "; cout << endl; for (int i = 0; i <= n; i++) cout << pab[i] << " "; cout << endl;*/ long long D1[n + 1]; long long D2[n + 1]; D1[0] = D2[0] = 0; for (int i = 1; i <= n; i++) { D1[i] = (D1[i - 1] + pab[i] * i) % mod; D2[i] = (D2[i - 1] + pab[i]) % mod; } for (long long x = 2; x < n; x++) { long long te = min(x - 1, n - x - 1); int pr = 0; int pa = n; while (pr < pa) { int mi = (pr + pa) / 2; if (pra[x] > pab[mi]) pr = mi + 1; else pa = mi; } long long y = min(pr, pa) - 1; /// ats += pra[x] * (min(y, te) * 1ll * (min(y, te) + 1) / 2) % mod; ats %= mod; if (y < te) { ats += D1[te]; if (y >= 0) ats -= D1[y]; ats %= mod; } //cout << ats << endl; if (2 * x <= n - 1) { if (y < x - 1) ats += (x - 1) * (D2[n - x - 1] - D2[x - 1]) % mod; else if (y <= n - x - 2) { ats += (x - 1) * (D2[n - x - 1] - D2[y]) % mod; ats += pra[x] * ((y + 1 - x) * (x - 1)) % mod; } else ats += (x - 1) * (pra[x] * (n - 2 * x)) % mod; ats %= mod; } //cout << ats << endl; } long long nn = (n * n) % mod; long long nnnn = (nn * nn) % mod; ats %= mod; ats += mod; ats %= mod; if (n % 2 == 1) ats += ma * ((((nnnn + 2 * nn + 4 * n + 1) % mod) * 125000001ll) % mod) % mod; else ats += ma * ((((nnnn + 2 * nn + 4 * n) % mod) * 125000001ll) % mod) % mod; ats %= mod; ats += mod; ats %= mod; cout << ats << endl; return 0; }