#include <bits/stdc++.h>
using namespace std;
constexpr int kN = int(1E5 + 10), kInf = int(1E9 + 10);
struct seg_tree {
  int val[kN << 2], flag[kN << 2];
  void init(int n, int l, int r) {
    val[n] = -kInf;
    flag[n] = 0;
    if (l < r) {
      int mid = (l + r) >> 1;
      init(n << 1, l, mid);
      init(n << 1 | 1, mid + 1, r);
    }
    return;
  }
  void addtag(int n, int x) {
    val[n] += x;
    flag[n] += x;
    return;
  }
  void push(int n) {
    if (flag[n]) {
      addtag(n << 1, flag[n]);
      addtag(n << 1 | 1, flag[n]);
      flag[n] = 0;
    }
    return;
  }
  void pull(int n) {
    val[n] = max(val[n << 1], val[n << 1 | 1]);
    return;
  }
  void add(int n, int l, int r, int L, int R, int x) {
    if (L <= l && r <= R)
      addtag(n, x);
    else if (!(l > R || L > r)) {
      int mid = (l + r) >> 1;
      push(n);
      add(n << 1, l, mid, L, R, x);
      add(n << 1 | 1, mid + 1, r, L, R, x);
      pull(n);
    }
    return;
  }
  void set(int n, int l, int r, int pos, int x) {
    if (l == r)
      val[n] = x;
    else {
      int mid = (l + r) >> 1;
      push(n);
      if (pos <= mid)
        set(n << 1, l, mid, pos, x);
      else
        set(n << 1 | 1, mid + 1, r, pos, x);
      pull(n);
    }
    return;
  }
};
seg_tree sg;
int a[kN];
int main() {
  int n, ans = 0, lst;
  stack<pair<int, int>> s;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) {
    lst = i;
    while (!s.empty()) {
      if (s.top().first < a[i]) {
        sg.add(1, 1, n, s.top().second, lst - 1, s.top().first - a[i]);
        lst = s.top().second;
        s.pop();
      } else
        break;
    }
    s.push({a[i], lst});
    sg.set(1, 1, n, i, -a[i]);
    sg.add(1, 1, n, 1, i, a[i]);
    ans = max(ans, sg.val[1]);
  }
  printf("%d\n", ans);
}
