#include void merge_sort(int x[], int n) { static int y[100001] = {}; if (n <= 1) return; merge_sort(&(x[0]), n/2); merge_sort(&(x[n/2]), (n+1)/2); int i, p, q; for (i = 0, p = 0, q = n/2; i < n; i++) { if (p >= n/2) y[i] = x[q++]; else if (q >= n) y[i] = x[p++]; else y[i] = (x[p] < x[q])? x[p++]: x[q++]; } for (i = 0; i < n; i++) x[i] = y[i]; } int main() { int i, N, P, A[100001], B[100001]; long long K; scanf("%d %lld %d", &N, &K, &P); for (i = 0; i < N; i++) scanf("%d", &(A[i])); for (i = 0; i < N; i++) scanf("%d", &(B[i])); merge_sort(A, N); merge_sort(B, N); int l[2], r[2], m, L = 0, R = P - 1, M; long long tmp; while (L < R) { M = (L + R) / 2; for (i = 0, tmp = 0; i < N; i++) { if (A[i] > M) { l[0] = 0; r[0] = N; while (l[0] < r[0]) { m = (l[0] + r[0]) / 2; if (B[m] < P - A[i]) l[0] = m + 1; else r[0] = m; } l[1] = -1; r[1] = N - 1; while (l[1] < r[1]) { m = (l[1] + r[1] + 1) / 2; if (B[m] > P + M - A[i]) r[1] = m - 1; else l[1] = m; } tmp += l[1] - l[0] + 1; } else { l[0] = 0; r[0] = N; while (l[0] < r[0]) { m = (l[0] + r[0]) / 2; if (B[m] < P - A[i]) l[0] = m + 1; else r[0] = m; } l[1] = -1; r[1] = N - 1; while (l[1] < r[1]) { m = (l[1] + r[1] + 1) / 2; if (B[m] > M - A[i]) r[1] = m - 1; else l[1] = m; } tmp += N - l[0] + l[1] + 1; } } if (tmp < K) L = M + 1; else R = M; } printf("%d\n", L); fflush(stdout); return 0; }