#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"; }