← Home
package main

import (
	"bufio"
	"io"
	"os"
	"sort"
	"strconv"
)

type Line struct {
	m int64
	b int64
}

const INF int64 = 1 << 62

var xs []int64
var tree []Line

func (ln Line) val(x int64) int64 {
	return ln.m*x + ln.b
}

func add(node, l, r int, nw Line) {
	if tree[node].b == INF {
		tree[node] = nw
		return
	}
	cur := tree[node]
	mid := (l + r) >> 1
	xl := xs[l]
	xm := xs[mid]

	left := nw.val(xl) < cur.val(xl)
	midBetter := nw.val(xm) < cur.val(xm)

	if midBetter {
		tree[node], nw = nw, tree[node]
		cur = tree[node]
	}

	if l == r {
		return
	}

	if left != midBetter {
		add(node<<1, l, mid, nw)
	} else {
		add(node<<1|1, mid+1, r, nw)
	}
}

func query(node, l, r, idx int, x int64) int64 {
	res := tree[node].val(x)
	if l == r {
		return res
	}
	mid := (l + r) >> 1
	var v int64
	if idx <= mid {
		v = query(node<<1, l, mid, idx, x)
	} else {
		v = query(node<<1|1, mid+1, r, idx, x)
	}
	if v < res {
		res = v
	}
	return res
}

func nextInt(data []byte, p *int) int64 {
	n := len(data)
	i := *p
	for i < n {
		c := data[i]
		if c != ' ' && c != '\n' && c != '\r' && c != '\t' {
			break
		}
		i++
	}
	sign := int64(1)
	if data[i] == '-' {
		sign = -1
		i++
	}
	var val int64
	for i < n {
		c := data[i]
		if c < '0' || c > '9' {
			break
		}
		val = val*10 + int64(c-'0')
		i++
	}
	*p = i
	return val * sign
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	ptr := 0
	n := int(nextInt(data, &ptr))

	pref := make([]int64, n+1)
	weighted := make([]int64, n+1)

	for i := 1; i <= n; i++ {
		a := nextInt(data, &ptr)
		pref[i] = pref[i-1] + a
		weighted[i] = weighted[i-1] + int64(i)*a
	}

	xs = make([]int64, n+1)
	copy(xs, pref)
	sort.Slice(xs, func(i, j int) bool { return xs[i] < xs[j] })
	k := 0
	for i := 0; i < len(xs); i++ {
		if k == 0 || xs[i] != xs[k-1] {
			xs[k] = xs[i]
			k++
		}
	}
	xs = xs[:k]

	pos := make(map[int64]int, k)
	for i, v := range xs {
		pos[v] = i
	}

	tree = make([]Line, 4*k+5)
	for i := range tree {
		tree[i].b = INF
	}

	add(1, 0, k-1, Line{0, 0})

	var ans int64
	for r := 1; r <= n; r++ {
		idx := pos[pref[r]]
		mn := query(1, 0, k-1, idx, pref[r])
		cur := weighted[r] - mn
		if cur > ans {
			ans = cur
		}
		x := int64(r)
		add(1, 0, k-1, Line{x, weighted[r] - x*pref[r]})
	}

	out := bufio.NewWriter(os.Stdout)
	out.WriteString(strconv.FormatInt(ans, 10))
	out.Flush()
}