#include <bits/stdc++.h>
#define int long long
#define fast cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
#define all(x) x.begin(),x.end()
#define alr(x) x.rbegin(),x.rend()
#define endl '\n'
#define emb emplace_back
#define F first
#define S second
#define yes cout << "YES\n"
#define no cout <<"NO\n"
#define pii pair< int , int>
#define PI acos(-1.0)
#define sz(x) (int)(x.size())
#define debug cout<<"________________________________" << endl;
using namespace std;
int const mod = 1e9+7, N = 2e5 + 10;
int n, k;
int a[1000][1000];
bool ok(int x)
{
int pref[n+10][n+10] , b[n+10][n+10];
memset(b, 0, sizeof b);
memset(pref, 0, sizeof pref);
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= n ; j ++)
if(a[i][j] >=x)b[i][j]=1;
else b[i][j]=-1;
}
pref[1][1] = b[1][1];
for(int i = 2 ; i <= n ; i ++)
{
pref[1][i] += pref[1][i-1] + b[1][i];
}
for(int i = 2 ; i <= n ; i ++)
{
pref[i][1] += pref[i-1][1] + b[i][1];
}
for (int i = 2; i <= n; i++)
{
for (int j = 2; j <= n; j++)
pref[i][j] = pref[i - 1][j] + pref[i][j - 1] - pref[i - 1][j - 1] + b[i][j];
}
for(int i = k ; i <= n ; i ++)
{
for(int j = k ; j <= n ; j ++)
{
int tmp = pref[i][j] + pref[i-k][j-k] - pref[i-k][j] - pref[i][j-k];
if(tmp < (k*k)/2 )return 1;
}
}
return 0;
}
void solve()
{
cin >> n >> k;
int mx = 0 ;
memset(a , 0 , sizeof a);
for(int i = 1 ; i <= n; i ++)
{
for(int j = 1 ; j <= n; j ++)
{
cin >> a[i][j];
mx = max(a[i][j], mx);
}
}
int l = 0, r = mx;
while(l+1 < r)
{
int mid = ( l + r )/2;
if(ok(mid))
{
r = mid;
}
else l = mid;
}
cout << l << endl;
}
int32_t main()
{
fast;
int test = 1;
/// cin >> test ;
while(test--)solve();
}
////////////////////////////////////////////////////
//bool isPrime(ll n)
//{
// if (n <= 1)return false;
// if (n <= 3)return true;
// if (n % 2 == 0||n % 3 == 0)return false;
// for (ll i = 5; i * i <= n; i = i + 6)
// if (n % i == 0||n % (i + 2) == 0)return false;
// return true;
//}
//
/////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////
//ll GCD(ll a,ll b )
//{
// return b ? GCD(b, a % b ) : a ;
//}
/////////////////////////////////////////////////////
//ll LCst(ll a, ll b)
//{
// return (a / GCD(a, b)) * b;
//}
//ll po(ll x, ll os)
//{
// if( os == 0 )
// return 1;
// ll z = po(x,os/2);
// if( os&1 )
// return z*z%stod*x%stod;
//
// return z*z%stod;
//}
////////////////////////////////////////////////////
//ll exEuclid(ll a, ll b, ll& x, ll& y)
//{
// if (b==0)
// {
// x=1;
// y=0;
// return a;
// }
// ll x1,y1;
// ll d=exEuclid(b,a%b,x1,y1);
// x=y1;
// y=x1-y1*(a/b);
// return d;
//}
/////////////////////////////////////////////////////////
//bool cmp(const pair<int, int>& a, const pair<int, int>& b)
//{
// if (a.first != b.first)return a.first > b.first;
// return a.second > b.second;
//}
/////////////////////////////////////////////////////////
///// indexed set
/////#include <ext/pb_ds/assoc_container.hpp>
/////#include <ext/pb_ds/tree_policy.hpp>
/////#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
/////using nastespace __gnu_pbds;
/////////////////////////////////////////////////////////