#include using namespace std; int n; vectora; int d[15][5017]; int lg[5017]; inline int get (int l, int r) { if (l > r) swap (l, r); return max (d[lg[r - l + 1]][l] , d[lg[r - l + 1]][r - (1 << lg[r - l + 1]) + 1]); } inline vector calc (vectora) { vectorb; for (int k = 0; k < (int)(a.size ()); ++k) { for (int i = 0; i < (int)(a.size ()) - k; ++i) { int j = i + k; b.push_back (get (i + 1, j + 1)); } } return b; } int main () { cin >> n; for (int i = 0; i < n; ++i) { int x; cin >> x; a.push_back (x); } for (int i = 1; i <= (int)(a.size ()); ++i) { d[0][i] = a[i - 1]; } for (int i = 2; i < 5000; ++i) { lg[i] = lg[i / 2] + 1; } for (int i = 1; i <= lg[(int)(a.size ())]; ++i) { for (int j = 1; j <= (int)(a.size ()) - (1 << lg[i]) + 1; ++j) { d[i][j] = max (d[i - 1][j], d[i - 1][j + (1 << (i - 1))]); } } a = calc (a); memset (d, 0, sizeof (d)); for (int i = 1; i <= (int)(a.size ()); ++i) { d[0][i] = a[i - 1]; } for (int i = 1; i <= lg[(int)(a.size ())]; ++i) { for (int j = 1; j <= (int)(a.size ()) - (1 << lg[i]) + 1; ++j) { d[i][j] = max (d[i - 1][j], d[i - 1][j + (1 << (i - 1))]); } } a = calc (a); int res = 0; for (auto &to : a) { res = ((res + to) % 1000000007 + 1000000007) % 1000000007; } cout << res; return 0; }