#define _p(...) (void)printf(__VA_ARGS__) #define fi first #define infInt 2147483647 #define infLongInt 2147483647 #define infLongLongInt 9223372036854775807 #define ll long int #define lld long long int #define mp make_pair #define pb push_back #define pii pair #define vi vector #define vpii vector #define SZ(x) ((int)(x.size())) #define IN(x,y) ((y).find((x))!=(y).end()) #define PI 3.14159265 #define foreach(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define rep(i,n) for(int i=0;i // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // over write the sqrt of orinal c function // #include // #include const int MOD = 1e9 + 7; using namespace std; template void priArr(T a[],int i,int j,string name="",bool nl = false) { if(name!= "" && nl) cout << name << "\n"; if(name!= "" && !nl) cout << name << " "; repd(b,i,j) { if(nl) cout << b << ":" << a[b] << "\n"; else cout << b << ":" << a[b] << " "; } if(!nl) newline } template void priArr(T a[],int i,string name="",bool nl = false) { if(name!= "" && nl) cout << name << "\n"; if(name!= "" && !nl) cout << name << " "; rep(b,i+1) { if(nl) cout << b << ":" << a[b] << "\n"; else cout << b << ":" << a[b] << " "; } if(!nl) newline } template void priVec(T a,int i,int j,string name="",bool nl = false) { if(name!= "" && nl) cout << name << "\n"; if(name!= "" && !nl) cout << name << " "; repd(b,i,j) { if(nl) cout << b << ":" << a[b] << "\n"; else cout << b << ":" << a[b] << " "; } if(!nl) newline } template void priVec(T a,int i,string name="",bool nl = false) { if(name!= "" && nl) cout << name << "\n"; if(name!= "" && !nl) cout << name << " "; int p = 0; rep(b,i) { if(nl) cout << b << ":" << a[b] << "\n"; else cout << b << ":" << a[b] << " "; p++; } if(!nl) newline } template T max1(T a,T b) { return a>b ? a :b; } template T min1(T a,T b) { return a T max1(T a,T b,T c) { return max1(a,max1(b,c)); } template T min1(T a,T b,T c) { return min1(a,min1(b,c)); } template T abs1(T a,T b) { return a>b ? a-b : b-a; } template void swap1(T a,T b) { T temp = b; b = a; a = temp; } template void swap1(T a[],int i,int j) { T temp = a[i]; a[i] = a[j]; a[j] = temp; } template void reset(T array[],int size,P value) { rep(i,size) array[i] = value; } //dont do silly mistake as always- //1-int or long long int or ull //2-do u understand question correctly? //3-MOST IMP-BE CALM YOU CAN DO:) //4-think edge case or corner case before submitting. //5-Think weather to use long long or long or int plau safe side on single variable. const int MAXN = 200000 + 10; const int MAXM = 100000 + 10; bool hack = false; int t,n; int arr[MAXN]; int vec[MAXN]; std::vector s; int main(int argc, char const *argv[]) { ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); cin >> n; rep(i,n) cin >> arr[i]; repd(len,0,n-1) rep(i,n-len) { // trace2(i,i+len); if(len == 0) { s.pb(arr[i]); vec[i] = arr[i]; } else { s.pb(max1(vec[i],arr[i+len])); vec[i] = max1(vec[i],arr[i+len]); } } // priVec(s,SZ(s),"s"); lld sum = 0; n = SZ(s); repd(len,0,n-1) rep(i,n-len) { if(len == 0) { sum = (sum + s[i])%MOD; vec[i] = s[i]; } else { sum = (sum + max1(vec[i],s[i+len]))%MOD; vec[i] = max1(vec[i],s[i+len]); } // trace2(vec[i],sum) } cout << sum << endl; return 0; }