## https://yukicoder.me/problems/no/3166 def solve2(N, L, K, X, p): if 2 * p >= L: return True # 座標圧縮 x_set = {0, L, 2 * L} for x in X: p1 = x - p p2 = x + p x_set.add(p1) x_set.add(x) x_set.add(p2) x_set.add(p1 + L) x_set.add(x + L) x_set.add(p2 + L) x_set.add(p1 + 2 * L) x_set.add(x + 2 * L) x_set.add(p2 + 2 * L) x_list = list(x_set) x_list.sort() x_map = {} for i, x in enumerate(x_list): x_map[x] = i x_len = len(x_list) # 円周を加味したimos法 array = [0] * (3 * x_len + 1) for x in X: p1 = x - p p2 = x + p for j in (L, 2 * L): y1 = x_map[(p1 + j)] y2 = x_map[(p2 + j)] array[y1] += 1 array[y2] -= 1 z = 0 for i in range(3 * x_len + 1): z += array[i] array[i] = z j0 = x_map[L] j1 = x_map[2 * L] for j in range(j0, j1): if array[j] < K: return False return True def solve(N, L, K, X): x_list = [2 * x for x in X] low = 0 high = 2 * L while high - low > 1: mid = (high + low) // 2 if solve2(N, 2 * L, K, x_list, mid): high = mid else: low = mid if solve2(N, 2 * L, K, x_list, low): p = low else: p = high if p % 2 == 1: return (p // 2) + 1 else: return p // 2 def main(): T = int(input()) answers = [] for _ in range(T): N, L, K = map(int, input().split()) X = list(map(int, input().split())) ans = solve(N, L, K, X) answers.append(ans) for ans in answers: print(ans) if __name__ == "__main__": main()