#include using namespace std; int MOD = (1e9)+7; int mod(int a){ return ((a >= MOD) ? (a%MOD) : (a)); } struct queueMax{ queue < int > fila; deque < int > deFila; void push( int val ){ fila.push(val); while( !deFila.empty() && deFila.back() < val ) deFila.pop_back(); deFila.push_back(val); } void pop( ){ if( fila.front() == deFila.front() ) deFila.pop_front(); fila.pop(); } int getMax(){ return deFila.front(); } }; void gera(vector < int > &vet){ vector < int > aux; int n = vet.size(); for(int k = 0; k < n; k++){ queueMax fila; for(int i = 0; i < k; i++){ fila.push(vet[i]); } for(int i = 0; i+k < n; i++){ fila.push(vet[i+k]); aux.push_back(fila.getMax()); fila.pop(); } } vet = aux; } int main(){ ios::sync_with_stdio(false); int n; scanf("%d", &n); vector < int > vet; vet.resize(n); for(int i = 0; i < n; i++){ scanf("%d",&vet[i]); } gera(vet); gera(vet); long long ans = 0; for(int i = 0; i < vet.size(); i++){ ans = mod(ans + vet[i]); } printf("%lld\n",ans); return 0; }