#include <iostream>
#include <vector>
#include <deque>
#include <limits>
#include <algorithm>
using namespace std;

typedef vector< long long > V1L;
typedef vector< V1L > V2L;
typedef vector< V2L > V3L;
typedef vector< V3L > V4L;

typedef vector<long long> VLL;
typedef vector< VLL > VVLL;

const long long INF = numeric_limits<long long>::max();


long long getmin_of_maxes(int a, int b, int n, int m, vector< vector<long long> > &v) {

    VVLL temp(n,VLL(m));

    for(int i=0;i<n;++i){
        vector<long long> &t = v[i];
        deque<int> dq;

        for(int j=0;j<m;++j){
            while(!dq.empty() && dq.front() < j-b+1) dq.pop_front();

            while(!dq.empty() && t[dq.back()]<=t[j]) dq.pop_back();
            dq.push_back(j);

            temp[i][j]=t[dq.front()];
        }
    }

    for(int j=0;j<m;++j){
        deque<int> dq;

        for(int i=0;i<n;++i){
            while(!dq.empty() && dq.front() < i-a+1) dq.pop_front();

            while(!dq.empty() && v[dq.back()][j]<=v[i][j]) dq.pop_back();
            dq.push_back(i);

            temp[i][j]=v[dq.front()][j];
        }

    }

    long long mn = INF;
    for(int i=a-1;i<n;++i)
        for(int j=b-1;j<m;++j)
            mn=min(mn,temp[i][j]);
    return mn;
}


int main(){
    int d1,d2,d3,d4;
    cin>>d1>>d2>>d3>>d4;
    int a,b,c,d;
    cin>>a>>b>>c>>d;

    V4L v(d1,V3L(d2,V2L(d3,V1L(d4))));

    for(int i=0; i<d1; i++)
        for(int j=0; j<d2; j++)
            for(int k=0; k<d3; k++)
                for(int l=0; l<d4; l++)
                    cin>>v[i][j][k][l];

    VVLL p(d1,VLL(d2));

    for(int i=0; i<d1; i++)
        for(int j=0; j<d2; j++)
            p[i][j] = getmin_of_maxes(c,d,d3,d4,v[i][j]);

    /*for(int i=0; i<d1; i++){
        for(int j=0; j<d2; j++)
            cout<<p[i][j]<<' ';
        cout<<endl;
    }*/

    cout<< getmin_of_maxes(a,b,d1,d2,p) <<"\n";
}