#include #include #include #include #include #include #include #define MAX(X, Y) ((X > Y) ? X : Y) int* solve(int A_size, int* A) { // Return the length of the longest possible sequence of moves modulo 10^9+7. long big = 1; for (int x = 0; x < 9; x++) { big *= 10; } big += 7; // int s = (int) sizeof(int); int *m = malloc(sizeof(int) * A_size * A_size); if (m == NULL) { return NULL; } //printf("help1"); for (int i = 0; i < A_size; i++) { m[i*A_size + i] = A[i]; for (int j = i-1; j >= 0; j--) { m[i*A_size + j] = MAX(m[(i-1)*A_size + j], m[i*A_size + (j+1)]); //printf("%i %i %i\n", i, j, m[i*A_size + j]); } } //printf("\nhelp2\n"); int tot = 0; int j; int c = 0; int *B = malloc(sizeof(int)*(A_size)*(A_size+1)/2); for (int k = 0; k < A_size; k++) { for (int i = 0; i < A_size - k; i++) { j = i+k; B[c] = m[j*A_size + i]; //printf("%d %d %d\n", i, j, B[c]); c++; } } free(m); //printf("\n"); return B; } 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* B = solve(n, a); int B_size = n*(n+1)/2; int* C = solve(B_size, B); int C_size = B_size*(B_size+1)/2; free(B); long tot = 0; long big = 1; for (int x = 0; x < 9; x++) { big *= 10; } big += 7; for (int k = 0; k < C_size; k++) { tot = (tot+C[k])%big; } free(C); printf("%ld\n", tot); return 0; }