#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion var n = I(); var az = new int[n + 2]; var max = az[^1] = I(); var k = I(); for (var i = 1; i <= n; i++) az[i] = I(); n += 2; bool F(long x) { var d1 = new int[n]; { var l = 0; d1.AsSpan().Fill(int.MinValue); for (var r = 0; r < n; r++) { var ar = az[r]; if (ar < x) continue; while (l + 1 < n && ar - az[l + 1] >= x) l++; d1[r] = l + 1; } } for (var i = 1; i < n; i++) d1[i] = Math.Max(d1[i], d1[i - 1] + 1); var d2 = new int[n]; d2.AsSpan().Fill(int.MinValue); { var r = n - 1; for (var l = n - 1; l >= 0; l--) { var al = az[l]; if (max - al < x) continue; while (r - 1 < n && az[r - 1] - al >= x) r--; d2[l] = n - r; } } for (var i = n - 2; i >= 0; i--) d2[i] = Math.Max(d2[i], d2[i + 1] + 1); for (var i = 1; i < n; i++) { if (d1[i - 1] < 0 || d2[i] < 0) continue; if (d1[i - 1] + d2[i] >= k) return true; } return false; } var fail = max + 1; var pass = 0; while (Math.Abs(fail - pass) >= 2) { var mid = (pass + fail) >> 1; if (F(mid)) pass = mid; else fail = mid; } Console.WriteLine(pass);