N, M, C, X = map(int, input().split()) A = [list(map(int, input().split())) for _ in range(N)] ok = -10 ** 9 ng = 10 ** 9 + 1 def solve(mid): dp = [[-(N + 1), -(N + 1)] for _ in range(M)] # dp[j][k]:= 直前の食材カテゴリがjで、(k=0の時、直前と一緒なので既に+1やってる)の時のmaxペナルティ数 for i in range(N): # print(i, dp) if(i == 0): for j in range(M): if(A[i][j] >= mid): dp[j][1] = 0 else: ndp = [[-(N + 1), -(N + 1)] for _ in range(M)] first = [-(N + 1), -(N + 1)] second = [-(N + 1), -(N + 1)] for j in range(M): for k in range(2): if(dp[j][k] >= first[k]): second[k] = first[k] first[k] = dp[j][k] elif(dp[j][k] >= second[k]): second[k] = dp[j][k] # print(first, second) for j in range(M): if(min(A[i - 1][j], A[i][j]) - C >= mid): ndp[j][0] = max(ndp[j][0], dp[j][0] + 1, dp[j][1] + 2) if(A[i][j] >= mid): max_v = -(N + 1) if(first[0] == dp[j][0]): max_v = max(max_v, second[0]) else: max_v = max(max_v, first[0]) if(first[1] == dp[j][1]): max_v = max(max_v, second[1]) else: max_v = max(max_v, first[1]) # print(i, j, max_v) ndp[j][1] = max(ndp[j][1], max_v) dp = ndp[:] # print(mid, dp) return max([max(l) for l in dp]) while (ng - ok) > 1: mid = (ok + ng) // 2 if(solve(mid) >= X): ok = mid else: ng = mid print(ok)