def check_stack(stack, result, index, value): while stack: el_index, el_value = stack.pop() if el_value >= value: stack.append((el_index, el_value)) break result[el_index] = index def get_nearest_greater_right(a, l): b = [-1] * l s = [(0, a[0])] for i in range(1, l): check_stack(s, b, i, a[i]) s.append((i, a[i])) return b def get_nearest_greater_left(a, l): b = [-1] * l s = [(l-1, a[-1])] for i in range(l-2, -1, -1): check_stack(s, b, i, a[i]) s.append((i, a[i])) return b def chooseNearest(index, left, right): if left == -1: if right == -1: return -1 return right if right == -1: return left if right - index < index - left: return right return left def nearestGreater(a): l = len(a) b1 = get_nearest_greater_left(a, l) b2 = get_nearest_greater_right(a, l) return [chooseNearest(i, b1[i], b2[i]) for i in range(0, len(a))]