#include #include #include #include using namespace std; typedef long long ll; const int N = 100000 + 10, INF = 0x3f3f3f3f; struct node { int idx, val, par, ch[2]; friend bool operator<(node a, node b) { return a.idx < b.idx; } void init(int _idx, int _val, int _par) { idx = _idx, val = _val, par = _par, ch[0] = ch[1] = 0; } } tree[N]; int root, top, stk[N]; ll ans; int cartesian_build(int n) { // 建树,满足小根堆性质 for (int i = 1; i <= n; i++) { int k = i - 1; while (tree[k].val > tree[i].val) k = tree[k].par; tree[i].ch[0] = tree[k].ch[1]; tree[k].ch[1] = i; tree[i].par = k; tree[tree[i].ch[0]].par = i; } return tree[0].ch[1]; } int dfs(int x) { // 一次dfs更新答案就可以了 if (!x) return 0; int sz = dfs(tree[x].ch[0]); sz += dfs(tree[x].ch[1]); ans = max(ans, (ll)(sz + 1) * tree[x].val); return sz + 1; } int main() { int n, hi; while (scanf("%d", &n), n) { tree[0].init(0, 0, 0); for (int i = 1; i <= n; i++) { scanf("%d", &hi); tree[i].init(i, hi, 0); } root = cartesian_build(n); ans = 0; dfs(root); printf("%lld\n", ans); } return 0; }