#include #include #include #include #include #include #include void max_transform(int A_size, int *A, int *B_size, int *B) { *B_size = 0; for (int k = 0; k < A_size; ++k) { for (int i = 0; i < A_size - k; ++i) { int j = i + k; int max_i_j = INT_MIN; for (int l = i; l <= j; ++l) { if (A[l] > max_i_j) { max_i_j = A[l]; } } B[*B_size] = max_i_j; *B_size = *B_size + 1; } } } int solve(int A_size, int* A) { // Return the sum of S(S(A)) modulo 10^9+7. int B_size = A_size * A_size; int *B = calloc(B_size, sizeof(int)); max_transform(A_size, A, &B_size, B); int C_size = B_size * B_size; int *C = calloc(C_size, sizeof(int)); max_transform(B_size, B, &C_size, C); int result = 0; for (int i = 0; i < C_size; ++i) { result += C[i]; } free(B); free(C); return result; } int main() { int n; scanf("%i", &n); int *a = malloc(sizeof(int) * n); for (int a_i = 0; a_i < n; a_i++) { scanf("%i",&a[a_i]); } int result = solve(n, a); printf("%d\n", result); return 0; }