#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

// union by size + path having
class UnionFind {
public:
    vector <ll> par; // 各元の親を表す配列
    vector <ll> siz; // 素集合のサイズを表す配列(1 で初期化)

    // Constructor
    UnionFind(ll sz_): par(sz_), siz(sz_, 1LL) {
        for (ll i = 0; i < sz_; ++i) par[i] = i; // 初期では親は自分自身
    }
    void init(ll sz_) {
        par.resize(sz_);
        siz.assign(sz_, 1LL);  // resize だとなぜか初期化されなかった
        for (ll i = 0; i < sz_; ++i) par[i] = i; // 初期では親は自分自身
    }

    // Member Function
    // Find
    ll root(ll x) { // 根の検索
        while (par[x] != x) {
            x = par[x] = par[par[x]]; // x の親の親を x の親とする
        }
        return x;
    }

    // Union(Unite, Merge)
    bool merge(ll x, ll y) {
        x = root(x);
        y = root(y);
        if (x == y) return false;
        // merge technique（データ構造をマージするテク．小を大にくっつける）
        if (siz[x] < siz[y]) swap(x, y);
        siz[x] += siz[y];
        par[y] = x;
        return true;
    }

    bool issame(ll x, ll y) { // 連結判定
        return root(x) == root(y);
    }

    ll size(ll x) { // 素集合のサイズ
        return siz[root(x)];
    }
};



int main(){
  ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  cout << fixed << setprecision(10);
  /*--------------------------------*/
  
  int n;cin>>n;
//   n=10000000;
  vector<ll> p(n);
  for(int i=0;i<n;i++)cin>>p[i];
//   for(int i=0;i<n;i++)p[i]=i+1;
  vector<pair<ll,ll> >vec(n);
  for(int i=0;i<n;i++){
      vec[i].first=p[i];vec[i].second=i;
  }
  sort(vec.begin(),vec.end());
  reverse(vec.begin(),vec.end());
  UnionFind tree(n);
  vector<int> flag(n);
  ll ans=-1;
  ll ans_name=-1,ans_size=-1;
  for(int i=0;i<n;i++){
      ll name=vec[i].second,value=vec[i].first;
      flag[name]=1;
      if(name!=0 && flag[name-1]==1){
          tree.merge(name,name-1);
          if(ans<tree.size(name)*value){
              ans=tree.size(name)*value;
              ans_name=value;
              ans_size=tree.size(name);
          }
      }
      if(name!=n-1 && flag[name+1]==1){
          tree.merge(name,name+1);
          if(ans<tree.size(name)*value){
              ans=tree.size(name)*value;
              ans_name=value;
              ans_size=tree.size(name);
          }
      }
  }
  ll res=ans_size*ans_name;
//   cout<<ans_size<<" "<<ans_name<<endl;
  for(int i=0;i<n;i++){
      res=max(res,(ll)p[i]);
    //   cout<<p[i]<<endl;
  }
  cout<<res<<endl;
}
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (lli i = a; i < b; i++)
#define lli long long int
#define ld long double
#define all(v) v.begin(), v.end()
#define hell 1000000000000000
#define pb push_back
#define vi vector<lli>
#define vip vector<pair<lli, lli>>
#define F first
#define S second
#define mod 998244353
lli n = 10000000;
vector<bool> p(n + 1, true);
void sieve()
{
    for (long long int i = 2; i * i <= n; i++)
    {
        if (p[i])
        {
            for (long long int j = i + i; j <= n; j = j + i)
            {
                p[j] = false;
            }
        }
    }
}
lli Gcd(lli a, lli b)
{
    if (a % b == 0)
    {
        return b;
    }
    return Gcd(b, a % b);
}
lli power(lli a, lli n)
{
    lli res = 1;
    while (n > 0)
    {
        if (n & 1)
            res = ((res % mod) * (a % mod)) % mod, n--;
        else
            a = ((a % mod) * (a % mod)) % mod, n /= 2;
    }
    return res;
}
void solve()
{
    lli n,ans=0;
    cin>>n;
    lli a[n];
    rep(i,0,n)
    {
        cin>>a[i];
    }
    rep(l,0,n)
    {
        lli x=a[l];
        rep(r,l,n)
        {
           x=min(x,a[r]);
           ans=max(ans,x*(r-l+1));
        }
        // cout<<ans<<" ";
    }
    cout<<ans;
    cout<<endl;
    // cout << (double)clock()/CLOCKS_PER_SEC << endl;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    // sieve();
    lli t = 1;
    while (t--)
    {
        solve();
    }
}