#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define SZ(x) ((int)x.size())
#define lowbit(x) x&-x
#define pb push_back
#define ls (u<<1)
#define rs (u<<1|1)
#define Rint register int
#define ALL(x) (x).begin(),(x).end()
#define UNI(x) sort(ALL(x)),x.resize(unique(ALL(x))-x.begin())
#define GETPOS(c,x) (lower_bound(ALL(c),x)-c.begin())
#define LEN(x) strlen(x)
#define MS0(x) memset((x),0,sizeof((x)))
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> Vi;
typedef vector<ll> Vll;
typedef vector<pii> Vpii;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(ll &x) { scanf("%lld", &x); }
void _R(ull &x) { scanf("%llu", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const ll &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T,class U> void _W(const pair<T,U> &x) {_W(x.F); putchar(' '); _W(x.S);}
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
const int MOD=1e9+7,mod=1e9+7;
ll qpow(ll a,ll b) {ll res=1;a%=MOD; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;}
const int MAXN=3e5+10,MAXM=2e6+10;
const int INF=INT_MAX,SINF=0x3f3f3f3f;
const ll llINF=LLONG_MAX;
const int inv2=5e8+4;
const int Lim=1<<20;

int n,ans;
int p[MAXN];
int dis[505][505];
queue<pii> q;
void pre(int i,int j)
{
    if(!dis[i][j])return;
    dis[i][j]=0;
    q.push({i,j});
}

int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool chk(int i,int j)
{
    if(i<1||j<1||i>n||j>n)return false;
    return true;
}

bool vis[505][505];

void deal(int x,int y)
{
    ans+=dis[x][y];
    q.push({x,y});
    vis[x][y]=0;
    while(!q.empty())
    {
        int x,y;
        tie(x,y)=q.front();q.pop();
        for(int i=0;i<4;i++)
        {
            int dx=x+d[i][0],dy=y+d[i][1];
            if(!chk(dx,dy))continue;
            if(dis[dx][dy]>dis[x][y]+vis[x][y])dis[dx][dy]=dis[x][y]+vis[x][y],q.push({dx,dy});
        }
    }
}

void solve()
{
    memset(vis,1,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    ans=0;
    R(n);
    for(int i=1;i<=n*n;i++)R(p[i]);
    for(int i=1;i<=n;i++)pre(1,i),pre(n,i),pre(i,1),pre(i,n);
    while(!q.empty())
    {
        int x,y;
        tie(x,y)=q.front();q.pop();
        for(int i=0;i<4;i++)
        {
            int dx=x+d[i][0],dy=y+d[i][1];
            if(!chk(dx,dy))continue;
            if(dis[dx][dy]>dis[x][y]+1)dis[dx][dy]=dis[x][y]+1,q.push({dx,dy});
        }
    }
    for(int i=1;i<=n*n;i++)
    {
        deal((p[i]-1)/n+1,(p[i]-1)%n+1);
    }
    W(ans);
}

int main()
{
    int T = 1;
    //R(T);
    while (T--)solve();
    return 0;
}


Measured memory_bytes: 6020