import sys
import bisect
def find_min_x():
# 快速读取输入(sys.stdin.read 比 input() 快10倍以上)
data = sys.stdin.read().split()
idx = 0
n = int(data[idx])
idx += 1
m = int(data[idx])
idx += 1
k = int(data[idx])
idx += 1
# 存储 (数值, 原始位置),原始位置从1开始(题目要求前x个数)
arr = []
for i in range(n):
val = int(data[idx])
idx += 1
arr.append((val, i + 1)) # 位置是1-based
# 按数值排序(这是O(n log n),无法优化,是必要步骤)
arr.sort()
min_x = float("inf")
left = 0
# 维护一个有序的位置列表(始终升序)
sorted_pos = []
# 右指针遍历,滑动窗口(O(n) 总时间)
for right in range(n):
# 1. 将当前元素的位置插入有序列表(二分插入,O(log n))
val_r, pos_r = arr[right]
bisect.insort(sorted_pos, pos_r)
# 2. 保证窗口内数值差 ≤k,左指针右移时删除对应位置
while val_r - arr[left][0] > k:
val_l, pos_l = arr[left]
# 从有序列表中删除左指针位置(二分查找+删除,O(log n))
pos_idx = bisect.bisect_left(sorted_pos, pos_l)
if pos_idx < len(sorted_pos) and sorted_pos[pos_idx] == pos_l:
del sorted_pos[pos_idx]
left += 1
# 3. 当有序位置列表长度 ≥m 时,找最小的最大位置
window_len = len(sorted_pos)
if window_len >= m:
# 有序列表中,第i个位置到i+m-1个位置的最大位置是 sorted_pos[i+m-1]
# 最小的最大位置就是 sorted_pos[m-1](因为列表升序,最左边的m个位置的最大位置最小)
current_max_pos = sorted_pos[m - 1]
if current_max_pos < min_x:
min_x = current_max_pos
# 输出结果
print(min_x if min_x != float("inf") else -1)
if __name__ == "__main__":
find_min_x()