#include<bits/stdc++.h>

using namespace std;

#define dbg(x) (cout<<#x<<" = "<<(x)<<'\n')

typedef long long int lld;
const int INF = (1LL << 30) - 1;
const lld LINF = (1LL << 62) - 1;

int N, M, K, L;
int A, B, C, D;
int V[40][40][40][40];
int P[40][40];
int Q[40][40][40];
int R[40][40][40][40];
deque<pair<int, int>> DQ;
int sol = INF;

int main() {
	cin.sync_with_stdio(false);

	#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	#endif

	scanf("%d%d%d%d", &N, &M, &K, &L);
	scanf("%d%d%d%d", &A, &B, &C, &D);

	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= M; j++)
			for (int k = 1; k <= K; k++)
				for (int l = 1; l <= L; l++)
					scanf("%d", &V[i][j][k][l]);

	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			for (int k = 1; k <= K; k++) {

				DQ.clear();
				for (int l = 1; l <= L; l++) {
					while (!DQ.empty() && DQ.front().second <= l - D)
						DQ.pop_front();
					while (!DQ.empty() && DQ.back().first <= V[i][j][k][l])
						DQ.pop_back();
					DQ.push_back({V[i][j][k][l], l});
					if (l >= D) P[k][l - D + 1] = DQ.front().first;
				}
			}

			for (int l = 1; l <= L - D + 1; l++) {

				DQ.clear();
				for (int k = 1; k <= K; k++) {
					while (!DQ.empty() && DQ.front().second <= k - C)
						DQ.pop_front();
					while (!DQ.empty() && DQ.back().first <= P[k][l])
						DQ.pop_back();
					DQ.push_back({P[k][l], k});
					if (k >= C) Q[j][k - C + 1][l] = DQ.front().first;
				}
			}
		}

		for (int k = 1; k <= K - C + 1; k++) {
			for (int l = 1; l <= L - D + 1; l++) {

				DQ.clear();
				for (int j = 1; j <= M; j++) {
					while (!DQ.empty() && DQ.front().second <= j - B)
						DQ.pop_front();
					while (!DQ.empty() && DQ.back().first <= Q[j][k][l])
						DQ.pop_back();
					DQ.push_back({Q[j][k][l], j});
					if (j >= B) R[i][j - B + 1][k][l] = DQ.front().first;
				}
			}
		}
	}

	for (int j = 1; j <= M - B + 1; j++) {
		for (int k = 1; k <= K - C + 1; k++) {
			for (int l = 1; l <= L - D + 1; l++) {

				DQ.clear();
				for (int i = 1; i <= N; i++) {
					while (!DQ.empty() && DQ.front().second <= i - A)
						DQ.pop_front();
					while (!DQ.empty() && DQ.back().first <= R[i][j][k][l])
						DQ.pop_back();
					DQ.push_back({R[i][j][k][l], i});
					if (i >= A) sol = min(sol, DQ.front().first);
				}
			}
		}
	}

	printf("%d\n", sol);

	return 0;
}