#include using namespace std; #define DEBUG 0 #define debug(...) if(DEBUG)fprintf(stderr, __VA_ARGS__); int N, M, K, L; int a, b, c, d; int di[] = {1, 0, 0, 0}, dj[] = {0, 1, 0, 0}, dk[] = {0, 0, 1, 0}, dl[] = {0, 0, 0, 1}; const int MAX_N = 36; typedef long long LL; int v[MAX_N][MAX_N][MAX_N][MAX_N]; bool ch[MAX_N][MAX_N][MAX_N][MAX_N]; int S[MAX_N][MAX_N][MAX_N][MAX_N]; void preprocess() { memset(S, 0, sizeof(S)); 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++) { int &now = S[i][j][k][l]; now = 0; for(int c = 0; c < (1 << 4); ++c) { int coef = -1; int ni = i, nj = j, nk = k, nl = l; for(int b = 0; b < 4; ++b) { if((1 << b) & c) { coef *= -1; ni -= di[b]; nj -= dj[b]; nk -= dk[b]; nl -= dl[b]; } } now += coef * S[ni][nj][nk][nl]; } now += ch[i][j][k][l]; debug("S[%d][%d][%d][%d] = %d\n", i, j, k, l, now); } } int query(int i, int j, int k, int l) { int x = i - a, y = j - b, z = k - c, w = l - d; int fin[] = {i, j, k, l}; int stt[] = {x, y, z, w}; int ret = 0; for(int c = 0; c < (1 << 4); ++c) { int coef = 1; int nn[4]; for(int b = 0; b < 4; ++b) { if(c & (1 << b)) { coef *= -1; nn[b] = stt[b]; } else { nn[b] = fin[b]; } } ret += S[nn[0]][nn[1]][nn[2]][nn[3]] * coef; } return ret; } bool ok(int val) { debug("binary searching with %d\n", val); 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++) ch[i][j][k][l] = v[i][j][k][l] > val; preprocess(); for(int i=a; i<=N; i++) for(int j=b; j<=M; j++) for(int k=c; k<=K; k++) for(int l=d; l<=L; l++) { int now = query(i, j, k, l); if(!now) { debug("OK\n"); return 1; } } debug("WRONG\n"); return 0; } int main() { 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]); int mn = v[1][1][1][1], mx = v[1][1][1][1]; 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++) { if(v[i][j][k][l] < mn) mn = v[i][j][k][l]; if(v[i][j][k][l] > mx) mx = v[i][j][k][l]; } int lo = mn, hi = mx; int sol = mx; while(lo <= hi) { int mid = (lo + hi) / 2; if(ok(mid)) { sol = mid; hi = mid - 1; } else { lo = mid + 1; } } cout << sol << "\n"; return 0; }