#include <bits/stdc++.h>
using namespace std;
int n,p[710][710],m,s,fa[600010],e,si[600010],dx[4]={-1,0},dy[4]={0,-1};
inline int read(){
int x=0,y=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')y=-y; ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*y;
}
struct node{
int zhi,x,y;
}a[250010];
bool check(int x,int y){
if(x>0&&x<=n&&y>0&&y<=n)
return true;
return false;
}
bool cmp(node x,node y){
return x.zhi<y.zhi;
}
int Find(int x){
int root=x;
while(root!=fa[root])
root=fa[root];
while(x!=root){
int tmp=fa[x];
fa[x]=root;
x=tmp;
}
return root;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
p[i][j]=read();
e++;
fa[e]=e;
si[e]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=0;k<2;k++){
int nx=i+dx[k],ny=j+dy[k];
if(check(nx,ny)){
s++;
a[s].x=(i-1)*n+j;
a[s].y=(nx-1)*n+ny;
a[s].zhi=abs(p[nx][ny]-p[i][j]);
}
}
}
}
sort(a+1,a+s+1,cmp);
for(int i=1;i<=s;i++){
int fx=Find(a[i].x),fy=Find(a[i].y);
if(fx!=fy){
fa[fx]=fy;
si[fy]+=si[fx];
if(si[fy]>=(n*n+1)/2){
cout<<a[i].zhi;
return 0;
}
}
}
}