Deloitte | COGNIZANT | IBM | CAPGEMINI
def findKthNextHigherDemandLevels(demandLevels, k):
n = len(demandLevels)
result = [-1] * n
sorted_unique_levels = sorted(list(set(demandLevels)))
rank_map = {val: i + 1 for i, val in enumerate(sorted_unique_levels)}
m = len(sorted_unique_levels)
tree = [0] * (4 * m + 1)
def update(node, start, end, idx, val):
if start == end:
tree[node] += val
return
mid = (start + end) // 2
if idx <= mid:
update(2 * node, start, mid, idx, val)
else:
update(2 * node + 1, mid + 1, end, idx, val)
tree[node] = tree[2 * node] + tree[2 * node + 1]
def query(node, start, end, l, r):
if r < start or end < l:
return 0
if l <= start and end <= r:
return tree[node]
mid = (start + end) // 2
return query(2 * node, start, mid, l, r) + query(2 * node + 1, mid + 1, end, l, r)
def find_kth(node, start, end, l, r, target_k):
if tree[node] < target_k:
return -1
if start == end:
return start
tree_max = [0] * (4 * n + 1)
def build(node, start, end):
if start == end:
tree_max[node] = demandLevels[start - 1]
return
mid = (start + end) // 2
build(2 * node, start, mid)
build(2 * node + 1, mid + 1, end)
tree_max[node] = max(tree_max[2 * node], tree_max[2 * node + 1])
build(1, 1, n)
def get_first_greater(node, start, end, l, r, val):
if r < start or end < l or tree_max[node] <= val:
return -1
if start == end:
return start
mid = (start + end) // 2
res = get_first_greater(2 * node, start, mid, l, r, val)
if res == -1:
res = get_first_greater(2 * node + 1, mid + 1, end, l, r, val)
return res
ans = []
for i in range(n):
current_val = demandLevels[i]
curr_idx = i + 2
target_idx = -1
for _ in range(k):
if curr_idx > n:
target_idx = -1
break
target_idx = get_first_greater(1, 1, n, curr_idx, n, current_val)
if target_idx == -1:
break
curr_idx = target_idx + 1
ans.append(target_idx)
return ans
findKthNextHigherDemandLevels✅
1.1K ·