#include <bits/stdc++.h>
using namespace std;
const int Inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3fll;
int Seed = 19260817;
int inline Rand() {
  Seed ^= Seed << 13;
  Seed ^= Seed >> 17;
  Seed ^= Seed << 5;
  return Seed;
}
struct Node {
  long long sm, wp, wc, len, val;
  int l, r, fix;
} t[1 << 18];
int nds;
int inline newnode(long long val) {
  ++nds;
  t[nds].sm = val;
  t[nds].wp = t[nds].wc = 0;
  t[nds].l = t[nds].r = 0;
  t[nds].len = 1;
  t[nds].val = val;
  t[nds].fix = Rand();
  return nds;
}
void inline pd(int now) {
  if (!now) return;
  t[now].val += t[now].wp;
  t[now].sm += t[now].len * t[now].wp;
  if (t[now].l) t[t[now].l].wp += t[now].wp;
  if (t[now].r) t[t[now].r].wp += t[now].wp;
  t[now].wp = 0;
  int cnt = 0;
  t[now].sm += t[now].len * (t[now].len - 1) / 2 * t[now].wc;
  if (t[now].l) {
    cnt += t[t[now].l].len;
    t[t[now].l].wc += t[now].wc;
  }
  t[now].val += cnt * t[now].wc;
  ++cnt;
  if (t[now].r) {
    t[t[now].r].wp += cnt * t[now].wc;
    t[t[now].r].wc += t[now].wc;
  }
  t[now].wc = 0;
}
void inline pu(int now) { t[now].len = t[t[now].l].len + 1 + t[t[now].r].len; }
int inline merge(int a, int b) {
  pd(a);
  pd(b);
  if (!a || !b) return a + b;
  int now;
  if (t[a].fix > t[b].fix) {
    now = a;
    t[now].r = merge(t[a].r, b);
  } else {
    now = b;
    t[now].l = merge(a, t[b].l);
  }
  return pu(now), now;
}
void inline split(int now, int len, int &a, int &b) {
  if (!now) return void(a = b = 0);
  pd(now);
  if (t[t[now].l].len >= len) {
    b = now;
    split(t[now].l, len, a, t[b].l);
  } else {
    a = now;
    split(t[now].r, len - t[t[now].l].len - 1, t[a].r, b);
  }
  pu(now);
}
int n, rt;
int a[1 << 17];
long long inline get(int rnk) {
  int l, m, r;
  split(rt, rnk, l, r);
  split(l, rnk - 1, l, m);
  long long val = t[m].val;
  rt = merge(l, merge(m, r));
  return val;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= (n); ++i) scanf("%d", a + i);
  rt = merge(newnode(0), newnode(a[1]));
  for (int i = (2); i <= (n); ++i) {
    int l = 0, r = i;
    while (r - l > 1) {
      int m = (l + r) >> 1;
      if (get(m) + 1ll * m * a[i] > get(m + 1))
        r = m;
      else
        l = m;
    }
    int L, R;
    long long val = get(r);
    split(rt, r - 1, L, R);
    t[R].wp += 1ll * r * a[i];
    t[R].wc += a[i];
    rt = merge(L, merge(newnode(val), R));
  }
  long long ans = 0;
  for (int i = 1; i <= (n + 1); ++i) ans = max(ans, get(i));
  printf("%lld\n", ans);
  return 0;
}
