#include <bits/stdc++.h>
using namespace std;
long long a[200100], sum[200100], qs[200100];
bool bad(pair<long long, long long> &a, pair<long long, long long> &b,
         pair<long long, long long> second) {
  return (a.second - second.second) * (b.first - a.first) >
         (a.second - b.second) * (second.first - a.first);
}
long long at(pair<long long, long long> a, long long x) {
  return a.first * x + a.second;
}
int back = 0;
pair<long long, long long> l[200100];
void add(long long first, long long second) {
  if (back >= 2 and bad(l[back - 2], l[back - 1], {first, second})) back--;
  l[back++] = {first, second};
}
long long query(long long x, int L = 0, int R = back - 1) {
  if (L + 1 == R) return max(at(l[L], x), at(l[R], x));
  if (L == R) return at(l[L], x);
  int mid = (L + R) / 2;
  if (at(l[mid], x) < at(l[mid - 1], x)) return query(x, L, mid - 1);
  if (at(l[mid], x) < at(l[mid + 1], x)) return query(x, mid + 1, R);
  return at(l[mid], x);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    scanf("%lld", &a[i]), qs[i] = a[i] + qs[i - 1],
                          sum[i] = a[i] * i + sum[i - 1];
  long long ans = 0;
  add(0, 0);
  for (int i = 1; i <= n; i++) {
    ans = max(ans, sum[i] + query(qs[i]));
    add(-i, -sum[i] + i * qs[i]);
  }
  printf("%lld", ans);
  return 0;
}
