defcalculate_contributions(arr, is_max=True): n = len(arr) left = [-1] * n # 左侧第一个大于(小于)当前元素的索引 right = [n] * n # 右侧第一个大于等于(小于等于)当前元素的索引 stack = [] # 寻找左侧边界 for i inrange(n): if is_max: # 对于最大值,寻找左侧第一个大于当前元素的位置 while stack and arr[stack[-1]] <= arr[i]: stack.pop() else: # 对于最小值,寻找左侧第一个小于当前元素的位置 while stack and arr[stack[-1]] >= arr[i]: stack.pop() if stack: left[i] = stack[-1] stack.append(i) stack = [] # 寻找右侧边界 for i inrange(n-1, -1, -1): if is_max: # 对于最大值,寻找右侧第一个大于等于当前元素的位置 while stack and arr[stack[-1]] < arr[i]: stack.pop() else: # 对于最小值,寻找右侧第一个小于等于当前元素的位置 while stack and arr[stack[-1]] > arr[i]: stack.pop() if stack: right[i] = stack[-1] stack.append(i) # 计算总贡献 total = 0 for i inrange(n): # 左侧可扩展的距离 left_count = i - left[i] # 右侧可扩展的距离 right_count = right[i] - i # 贡献 = 元素值 × 以该元素为最大(小)值的子序列数量 total += arr[i] * left_count * right_count return total
n = int(input()) arr = [int(input()) for _ inrange(n)]