rt
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define deap(i,a,b) for(int i=a;i>=b;i--)
#define in(a) a=read()
const int N = 1e3+5;
const int inf = INT_MAX;
inline int read() {
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') {
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
void fast() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
int n,k,a[N][N],b[N];
int p;
bool check(int x) {
memset(b,0,sizeof b);
//cout<<x<<':' ;
int i=1,j=1,ans=0,bit=1;
while(i<=k) {//初始化扫描线
while(j<=k) {
if(a[j][i]<=x) {
b[i]++;
ans++;
}
j++;
}
j=1;
i++;
}
//cout<<ans<<' ';
if(ans>p)return true;//如果初始化的结果成立,返回 true
while(i<=n) { //初始化重合数组
while(j<=k) {
if(a[j][i]<=x) {//扫描到的新增元素
b[i]++;
ans++;
}
if(a[i-k][j]<=x) {//删除边界元素
ans--;
}
j++;
}
// cout<<ans<<' ';
if(ans>p)return true;//如果初始化的结果成立,返回 true
j=1;
i++;
}
j=k;
while(j<=n) { //开始 S 型扫描
while(1<=i&&i<=n) { //整行扫描
ans=ans+b[i]-b[i-bit*k];
// cout<<ans<<' ';
if(ans>p)return true;//如果扫描结果成立,返回 true
i+=bit;
}
j++;
bit=-bit;
i+=bit*k;
rep(vis,1,n){//重合数组整体下移
if(a[j][vis]<=x) {
b[vis]++;
}
if(a[j-k][vis]<=x) {
b[vis]--;
}
}
int l=i-bit*k,r=i;
if(l>r)swap(l,r);
rep(vis,l,r){
if(a[j][vis]<=x) {
ans++;
}
if(a[j-k][vis]<=x) {
ans--;
}
}
}
return false;
}
signed main() {
//fast();
in(n),in(k);
int l=0,r=INT_MIN;
p=((k*k)>>1)-(!((k*k)&1));
rep(i,1,n) {
rep(j,1,n) {
in(a[i][j]);
if(a[i][j]>r)r=a[i][j];
}
}
int ans=r;
while(l<=r) {
int mid=(l+r)>>1;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans;
return 0;
}
/*
3 2
1 7 0
5 8 11
10 4 2
*/