#include #include #include #include #include #define MOD 1000000007 // O(n) int max_range(const std::vector& A, int i, int j) { int max_v = 0; for(int u = i; u <= j; ++u) { if (A[u] > max_v) { max_v = A[u]; } } return max_v; } // O(n^2) void precomp_max(const std::vector& A, std::vector< std::vector >& M) { int n = A.size(); int max_v; for(int i = 0; i < n; ++i) { max_v = A[i]; for(int j = i; j < n; ++j) { if (A[j] > max_v) { max_v = A[j]; } M[i][j] = max_v; } } return; } void max_transform(const std::vector& A, const std::vector< std::vector >& M, std::vector& SA) { int n = A.size(); int j; int pos = 0; for(int k = 0; k < n; ++k) { for(int i = 0; i < n-k; ++i) { j = i + k; SA[pos] = M[i][j]; ++pos; } } return; } int sum_max_transform(const std::vector& A) { int n = A.size(); int j; long long int total = 0; for(int k = 0; k < n; ++k) { for(int i = 0; i < n-k; ++i) { j = i + k; total = (total + max_range(A, i, j)) % MOD; } } return total; } int main() { int n; std::cin >> n; std::vector A(n); for(int i = 0; i < n; ++i) { std::cin >> A[i]; } std::vector< std::vector > M(n, std::vector(n, 0)); precomp_max(A, M); int n2 = (n*(n+1)) / 2; std::vector SA(n2); max_transform(A, M, SA); std::cout << sum_max_transform(SA) << std::endl; return 0; }