#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0;
char c=getchar();
while(c>'9'||c<'0'){
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x;
}
struct lines{
int u,v;
long long val;
bool operator < (const lines & a)const{
return val<a.val;
}
}l[250001];
int n;
int f[250001];
int size[250001];
int a[250001];
int tot;
int find(int x){
if(f[x]!=x)f[x]=find(f[x]);
return f[x];
}
inline void unity(int x,int y,long long w){
x=find(x);
y=find(y);
if(x!=y){
f[x]=y;
size[y]+=size[x];
if(size[y]>=(n*n+1)/2){
cout<<w;
exit(0);
}
}
}
inline int ex(int i,int j){
return (i-1)*n+j;
}
inline void buildmap(){
for(int i=2;i<=n;i++){
for(int j=1;j<=n;j++){
l[++tot].u=ex(i,j);
l[tot].v=ex(i-1,j);
l[tot].val=abs(a[ex(i,j)]-a[ex(i-1,j)]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<n;j++){
l[++tot].u=ex(i,j);
l[tot].v=ex(i,j+1);
l[tot].val=abs(a[ex(i,j)]-a[ex(i,j+1)]);
}
}
}
int main(){
n=read();
for(int i=1;i<=n*n;i++){
f[i]=i;
size[i]=1;
}
for(int i=1;i<=n*n;i++){
a[i]=read();
}
buildmap();
sort(l+1,l+tot+1);
for(int i=1;i<=tot;i++){
if(find(l[i].u)!=find(l[i].v)){
unity(l[i].u,l[i].v,l[i].val);
}
}
return 0;
}