#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, a, b) for (ll i = a; i < b; i++)
#define rrep(i, a, b) for (ll i = b - 1; a <= i; i--)
ll MOD = 1000000007;

ll N, K, A[800][800];

int main () {
  cin >> N >> K;
  rep (i, 0, N) rep (j, 0, N) cin >> A[i][j];

  // 中央値がx以下の区画が存在する
  // <=> ある区画aが存在して、aのマスの内高さがxより大きいものがfloor(K^2 / 2)個以下存在
  // cnt[i][j] : 右下のマスが(i,j)であるような区画に存在する高さがより大きいマスの個数
  // (i < K-1 || j < K-1)の場合、はみ出す部分は無視する

  ll l = -1, r = 1e9;
  while (r - l > 1) {
    ll x = (l + r) / 2;
    ll cnt[N][N];
    rep (i, 0, N) rep (j, 0, N) {
      cnt[i][j] = (A[i][j] > x);
      if (0 <= i - 1) cnt[i][j] += cnt[i-1][j];
      if (0 <= j - 1) cnt[i][j] += cnt[i][j-1];
      if (0 <= i - 1 && 0 <= j - 1) cnt[i][j] -= cnt[i-1][j-1];
      if (0 <= i - K) cnt[i][j] -= (A[i-K][j] > x);
      if (0 <= j - K) cnt[i][j] -= (A[i][j-K] > x);
      if (0 <= i - K && 0 <= j - K) cnt[i][j] += (A[i-K][j-K] > x);
    }

    // ---プリントデバッグ用---
    // cout << "---\n";
    // cout << "x = " << x << endl;
    // rep (i, 0, N) {
    //   rep (j, 0, N) {
    //     cout << left << setw(3) << cnt[i][j];
    //   }
    //   cout << endl;
    // }
    // ---

    bool b = false;
    rep (i, K - 1, N) {
      rep (j, K - 1, N) {
        if (cnt[i][j] <= floor(K * K / 2)) {
          b = true;
          break;
        }
      }
      if (b) break;
    }

    if (b) r = x;
    else l = x;
  }

  cout << r;
}

#include <cstdio>
#include <cstring>
#include <algorithm>
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define int long long
const int N=1e6+5;
const int p=998244353;
template<class T>inline void read(T &x) {
	T f=1;x=0;char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
	while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
	x*=f;
}
int fac[5001],inv[5001];
inline int ksm(int a,int b) { int ans=1; for(;b;b>>=1,(a*=a)%=p) if(b&1) (ans*=a)%=p; return ans; }
inline int C(int a,int b) { return fac[a]*inv[b]%p*inv[a-b]%p; }
int f[5001],g[5001];
int n,m;
signed main() {
	fac[0]=1; inv[0]=1;
	rep(i,1,5000) (fac[i]=fac[i-1]*i%p),inv[i]=ksm(fac[i],p-2); 
	read(n); read(m);
	f[0]=1;
	rep(nw,0,12) {
		memset(g,0,sizeof(g));
		rep(i,0,m) {
			rep(j,0,n) {
				if((i+(1<<nw)*j*2)>m) break;
				(g[i+(1<<nw)*j*2]+=f[i]*C(n,j*2)%p)%=p;
			}
		}
		rep(i,0,m) f[i]=g[i];
	}
	printf("%lld\n",f[m]);
}