#include<bits/stdc++.h>
using namespace std;
int a[501][501],n,ans=0,lim,minx,miny,minn=INT_MAX,maxn=INT_MIN;
bool vis[501][501];
void dfs(int x,int y){
if(x<0||y<0||x>n||y>n||vis[x][y])return;
vis[x][y]=1;
if(abs(a[x][y]-a[x+1][y])<=lim)dfs(x+1,y);
if(abs(a[x][y]-a[x-1][y])<=lim)dfs(x-1,y);
if(abs(a[x][y]-a[x][y+1])<=lim)dfs(x,y+1);
if(abs(a[x][y]-a[x][y-1])<=lim)dfs(x,y-1);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]<minn){
minn=a[i][j];minx=i;miny=j;
}
maxn=max(maxn,a[i][j]);
}
}
int l=minn,r=maxn;
while(l!=r){
memset(vis,0,sizeof(vis));
ans=0;
lim=(l+r)/2;
dfs(minx,miny);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(vis[i][j])ans++;
}
}
if(ans>n*n/2){
r=lim;
}
else{
l=lim+1;
}
}
cout<<lim;
}