Buggy python submission (verdict: Runtime Error):
N = int(input())
A = [(a, i) for i, a in enumerate(map(int, input().split()))]
A.sort(reverse=True)
A.append((0, 0))

ans = [0] * N
now = float('inf')

for j, (a, i) in enumerate(A[:N], start=1):
    now = min(now, a)
    ans[now] += j * (now - A[j][0])

print(*ans, sep='\n')


Fixed submission:
N = int(input())
A = list(map(int, input().split()))

# 現在末尾に追加される山より若い山で，最も個数の大きいものが次の山になる
# 他の山を次の山の個数以下まで減らす

ans = [0] * N

numList = [(a, i) for i, a in enumerate(A)]
numList.sort(reverse=True)
numList.append((0, 0))

y = float('inf')
for c, (a, i) in enumerate(numList[: N], start=1):
    y = min(y, i)
    ans[y] += c * (a - numList[c][0])

print(*ans, sep='\n')

Buggy python submission (verdict: Time Limit Exceeded):
from collections import deque, defaultdict

N = int(input())
A = list(map(int, input().split()))

# 現在末尾に追加される山より若い山で，最も個数の大きいものが次の山になる
# 他の山を次の山の個数以下まで減らす

nextNumIndex = deque([0])

for i, a in enumerate(A[1:], start=1):
    if a > A[nextNumIndex[-1]]:
        nextNumIndex.append(i)

V = set()  # 大きい山
W = set(range(N))  # 小さい山
ansList = defaultdict(int)

while len(nextNumIndex) > 1:
    nowIndex = nextNumIndex.pop()
    nextIndex = nextNumIndex[-1]

    newW = set()
    cnt = len(V) * (A[nowIndex] - A[nextIndex])
    for w in W:
        if A[w] >= A[nextIndex]:
            V.add(w)
            cnt += A[w] - A[nextIndex]
        else:
            newW.add(w)
    W = newW
    ansList[nowIndex] = cnt

    if len(nextNumIndex) == 1:
        for i in range(N):
            A[i] = min(A[i], A[nextIndex])

ansList[0] = sum(A)

ans = []
for i in range(N):
    ans.append(ansList[i])

print(*ans, sep='\n')

Fixed submission:
N = int(input())
A = list(map(int, input().split()))

# 現在末尾に追加される山より若い山で，最も個数の大きいものが次の山になる
# 他の山を次の山の個数以下まで減らす

ans = [0] * N

numList = [(a, i) for i, a in enumerate(A)]
numList.sort(reverse=True)
numList.append((0, 0))

y = float('inf')
for c, (a, i) in enumerate(numList[: N], start=1):
    y = min(y, i)
    ans[y] += c * (a - numList[c][0])

print(*ans, sep='\n')

Buggy python submission (verdict: Time Limit Exceeded):
from collections import deque, defaultdict

N = int(input())
A = list(map(int, input().split()))

# 現在末尾に追加される山より若い山で，最も個数の大きいものが次の山になる
# 他の山を次の山の個数以下まで減らす

nextNumIndex = deque([0])

for i, a in enumerate(A[1:], start=1):
    if a > A[nextNumIndex[-1]]:
        nextNumIndex.append(i)

V = set()  # 大きい山
W = set(range(N))  # 小さい山
ansList = defaultdict(int)

while len(nextNumIndex) > 1:
    nowIndex = nextNumIndex.pop()
    nextIndex = nextNumIndex[-1]

    newW = set()
    cnt = len(V) * (A[nowIndex] - A[nextIndex])
    for w in W:
        if A[w] >= A[nextIndex]:
            V.add(w)
            cnt += A[w] - A[nextIndex]
        else:
            newW.add(w)
    W = newW
    ansList[nowIndex] = cnt

    if len(nextNumIndex) == 1:
        for i in range(N):
            A[i] = min(A[i], A[nextIndex])

ansList[0] = sum(A)

ans = []
for i in range(N):
    ans.append(ansList[i])

print(*ans, sep='\n')

Fixed submission:
N = int(input())
A = list(map(int, input().split()))

# 現在末尾に追加される山より若い山で，最も個数の大きいものが次の山になる
# 他の山を次の山の個数以下まで減らす

ans = [0] * N

numList = [(a, i) for i, a in enumerate(A)]
numList.sort(reverse=True)
numList.append((0, 0))

y = float('inf')
for c, (a, i) in enumerate(numList[: N], start=1):
    y = min(y, i)
    ans[y] += c * (a - numList[c][0])

print(*ans, sep='\n')

Buggy python submission (verdict: Time Limit Exceeded):
from collections import deque, defaultdict

N = int(input())
A = list(map(int, input().split()))

# 現在末尾に追加される山より若い山で，最も個数の大きいものが次の山になる
# 他の山を次の山の個数以下まで減らす

nextNumIndex = deque([0])

for i, a in enumerate(A[1:], start=1):
    if a > A[nextNumIndex[-1]]:
        nextNumIndex.append(i)

ans = defaultdict(int)
while len(nextNumIndex) > 1:
    nowNum = nextNumIndex.pop()
    nextNum = nextNumIndex[-1]
    cnt = 0
    for i in range(nextNum, N):
        cnt += max(0, A[i] - A[nextNum])
        A[i] = min(A[i], A[nextNum])

    ans[nowNum] = cnt

ans[nextNumIndex.pop()] = sum(A)

out = []
for i in range(N):
    out.append(ans[i])
print(*out, sep='\n')

Fixed submission:
N = int(input())
A = list(map(int, input().split()))

# 現在末尾に追加される山より若い山で，最も個数の大きいものが次の山になる
# 他の山を次の山の個数以下まで減らす

ans = [0] * N

numList = [(a, i) for i, a in enumerate(A)]
numList.sort(reverse=True)
numList.append((0, 0))

y = float('inf')
for c, (a, i) in enumerate(numList[: N], start=1):
    y = min(y, i)
    ans[y] += c * (a - numList[c][0])

print(*ans, sep='\n')