#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
using i64 = int;
using i32 = int;
using f64 = long double;
template <class Key>
using vec = vector<Key>;
template <class Key>
using hash_set = unordered_set<Key>;
template <class Key, class Value>
using hash_map = unordered_map<Key, Value>;
using str = string;
template <size_t Size1>
using a64 = array<i64, Size1>;
template <size_t Size1, size_t Size2>
using aa64 = array<a64<Size2>, Size1>;
using p64 = pair<i64, i64>;
using v64 = vec<i64>;
using vv64 = vec<v64>;
using s64 = set<i64>;
using m64 = map<i64, i64>;
mt19937 gen(998244353);
const i64 inf = numeric_limits<i64>::max() / 2;
template <class T>
inline i64 sz(const T& a) {
  return (i64)(a.size());
}
inline void fast() { ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); }
template <class T, class S>
inline bool check_min(T& a, S b) {
  if (a > b) return a = b, 1;
  return 0;
}
template <class T, class S>
inline bool check_max(T& a, S b) {
  if (a < b) return a = b, 1;
  return 0;
}
void read() {}
void print() {}
template <class T, class... U>
void read(T& a, U&... b) {
  cin >> a;
  read(b...);
}
template <class T, class... U>
void print(const T& a, const U&... b) {
  cout << a;
  print(b...);
}
struct Problem {
  void files(str in, str out) {
    freopen(in.c_str(), "r", stdin), freopen(out.c_str(), "w", stdout);
  }
  void solve(), input();
  void many() {
    i64 t;
    cin >> t;
    while (t--) input(), solve();
  }
  void make(bool mt = 0) {
    if (mt)
      many();
    else
      input(), solve();
  }
} problem;
signed main() {
  fast();
  problem.make();
  return 0;
}
i64 n;
v64 a;
const i64 MAXC = 30;
void Problem::solve() {
  vec<hash_map<i64, i64>> dp(n + 1);
  for (i64 k = -MAXC; k <= MAXC; k++) {
    dp[0][k] = 0;
  }
  i64 ans = 0;
  for (i64 i = 1; i <= n; i++) {
    for (i64 k = -MAXC; k <= MAXC; k++) {
      dp[i][k] = -inf;
    }
    dp[i][a[i]] = a[i];
    for (i64 k = -MAXC; k <= MAXC; k++) {
      if (a[i] >= k) {
        check_max(dp[i][a[i]], dp[i - 1][k] + a[i]);
      } else {
        check_max(dp[i][k], dp[i - 1][k] + a[i]);
      }
    }
    for (i64 k = -MAXC; k <= MAXC; k++) {
      if (check_max(ans, dp[i][k] - k)) {
        continue;
      }
    }
  }
  cout << ans << "\n";
}
void Problem::input() {
  read(n);
  a.assign(n + 1, 0);
  for (i64 i = 1; i <= n; i++) {
    read(a[i]);
  }
}
