#include #include #include #include #include #include #define M 1000000007 #define lli long long #define MAX 1000005 using namespace std; pair RMQ[MAX][21]; lli A[MAX]; lli cum_mx[MAX]; lli cum_mn[MAX]; map mp; pair combine(pair a, pair b) { return make_pair(max(a.first, b.first), min(a.second, b.second)); } pair query(int l, int r) { int k = (int)log2(r - l + 1); return combine(RMQ[l][k], RMQ[r - (1 << k) + 1][k]); } int main() { int n; freopen("inp7.txt", "r", stdin); freopen("out7.txt", "w", stdout); cin >> n; assert(n >= 1 && n <= 1000000); for ( int i = 1; i <= n; i++ ) { cin >> A[i]; assert(A[i] >= 0 && A[i] <= 1000000000); RMQ[i][0] = make_pair(A[i], A[i]); } for ( int j = 1; (1 << j) <= n; j++ ) { for ( int i = 1; i + (1 << j) - 1 <= n; i++ ) { RMQ[i][j] = combine(RMQ[i][j - 1], RMQ[i + (1 << (j - 1))][j - 1]); } } for ( int i = 1; i <= n; i++ ) { int l = 1, r = i, mid, idx; while ( l <= r ) { mid = (l + r)/2; lli val = query(mid, i).first; if ( val <= A[i] ) { idx = mid; r = mid - 1; } else l = mid + 1; } lli inc_val = (A[i]*(lli)(i - idx + 1))%M; l = i + 1, r = n, idx = i; while ( l <= r ) { mid = (l + r)/2; lli val = query(i + 1, mid).first; if ( val < A[i] ) { idx = mid; l = mid + 1; } else r = mid - 1; } cum_mx[i] = (cum_mx[i] + inc_val)%M; cum_mx[idx + 1] = (cum_mx[idx + 1] + M - inc_val)%M; } for ( int i = 1; i <= n; i++ ) cum_mx[i] = (cum_mx[i] + cum_mx[i - 1])%M; for ( int i = n; i >= 1; i-- ) { int l = i, r = n, mid, idx; while ( l <= r ) { mid = (l + r)/2; lli val = query(i, mid).second; if ( val >= A[i] ) { idx = mid; l = mid + 1; } else r = mid - 1; } lli inc_val = (A[i]*(lli)(idx - i + 1))%M; l = 1, r = i - 1, idx = i; while ( l <= r ) { mid = (l + r)/2; lli val = query(mid, i - 1).second; if ( val > A[i] ) { idx = mid; r = mid - 1; } else l = mid + 1; } cum_mn[idx] = (cum_mn[idx] + inc_val)%M; cum_mn[i + 1] = (cum_mn[i + 1] + M - inc_val)%M; } for ( int i = 1; i <= n; i++ ) cum_mn[i] = (cum_mn[i] + cum_mn[i - 1])%M; lli ans = 0; for ( int i = n - 1; i >= 1; i-- ) { cum_mn[i] = (cum_mn[i] + cum_mn[i + 1])%M; } for ( int i = 1; i <= n - 1; i++ ) { ans = (ans + (cum_mx[i]*cum_mn[i + 1])%M)%M; } cout << ans << endl; return 0; }