#include #include #include #include #include using namespace std; typedef unsigned int ui; typedef unsigned long long ul; typedef long long sl; ui a[200000], t[8000000]; void bld(ui* pa, ui v, ui tl, ui tr) { if (tl == tr) t[v] = pa[tl]; else { ui tm = (tl + tr) / 2, vv = v * 2; bld(pa, vv, tl, tm); bld(pa, vv + 1, tm + 1, tr); t[v] = max(t[vv], t[vv + 1]); } } ui gmx(ui v, ui tl, ui tr, ui l, ui r) { if (l > r) return 0; if (l == tl && r == tr) return t[v]; ui tm = (tl + tr) / 2; return max(gmx(v * 2, tl, tm, l, min(r, tm)), gmx(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r)); } void mks(vector& v, ui* p, ui n) { for (ui k = 0; k < n; ++k) { for (ui i = 0; i < n - k; ++i) v.push_back(gmx(1, 0, n - 1, i, i + k)); } } ul sum(ui n) { ul r = 0; for (ui k = 0; k < n; ++k) { for (ui i = 0; i < n - k; ++i) r = (r + gmx(1, 0, n - 1, i, i + k)) % 1000000007; } return r; } int main(int argc, char* argv[]) { ios_base::sync_with_stdio(false); ui n; cin >> n; for (ui i = 0; i < n; ++i) cin >> a[i]; bld(a, 1, 0, n - 1); vector b; mks(b, a, n); bld(&b[0], 1, 0, b.size() - 1); ul r = sum(b.size()); cout << r << endl; return 0; }