#include <bits/stdc++.h>
using namespace std;
template <typename _t>
inline void read(_t &x) {
  x = 0;
  _t fu = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') fu = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch & 15);
    ch = getchar();
  }
  x *= fu;
}
long long gcd(long long x, long long y) { return !x ? y : gcd(y % x, x); }
void exgcd(long long a, long long b, long long &x, long long &y) {
  if (!b) {
    x = 1;
    y = 0;
    return;
  }
  exgcd(b, a % b, y, x);
  y -= a / b * x;
}
struct Mart {
  int a, b, c, d;
  Mart operator*(Mart &m) {
    Mart temp;
    temp.a = a * m.a + b * m.c;
    temp.b = a * m.b + b * m.d;
    temp.c = c * m.a + d * m.c;
    temp.d = c * m.b + d * m.d;
    return temp;
  }
  Mart() { a = b = c = d = 0; }
  Mart(int x[4]) {
    a = x[0];
    b = x[1];
    c = x[2];
    d = x[3];
  }
  Mart(int u, int v, int w, int x) {
    a = u;
    b = v;
    c = w;
    d = x;
  }
  int det() { return a * d - b * c; }
};
const int maxn = 500 + 10;
const int inf = 1 << 30;
int a[maxn * maxn];
struct ST {
  int tag[maxn << 1], st[maxn << 1];
  inline void up(int p) { st[p] = st[(p << 1)] + st[((p << 1) | 1)]; }
  void build(int p, int l, int r) {
    if (l == r) {
      st[p] = 1;
      return;
    }
    build((p << 1), l, ((l + r) >> 1));
    build(((p << 1) | 1), ((l + r) >> 1) + 1, r);
    up(p);
  }
  void update(int p, int l, int r, int x, int k) {
    if (l == r && l == x) {
      st[p] = k;
      return;
    }
    if (x <= ((l + r) >> 1))
      update((p << 1), l, ((l + r) >> 1), x, k);
    else
      update(((p << 1) | 1), ((l + r) >> 1) + 1, r, x, k);
    up(p);
  }
  int query(int p, int l, int r, int L, int R) {
    if (R < L) return 0;
    if (L <= l && r <= R) {
      return st[p];
    }
    int ans = 0;
    if (L <= ((l + r) >> 1)) ans += query((p << 1), l, ((l + r) >> 1), L, R);
    if (R > ((l + r) >> 1))
      ans += query(((p << 1) | 1), ((l + r) >> 1) + 1, r, L, R);
    return ans;
  }
} row[maxn], col[maxn];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    row[i].build(1, 1, n);
    col[i].build(1, 1, n);
  }
  long long ans = 0;
  int temp[4];
  for (int i = 0, x, y; i < n * n; i++) {
    scanf("%d", a + i);
    a[i]--;
    x = a[i] / n;
    y = a[i] % n;
    x++;
    y++;
    temp[0] = col[y].query(1, 1, n, 1, x - 1);
    temp[1] = row[x].query(1, 1, n, 1, y - 1);
    temp[2] = col[y].query(1, 1, n, x + 1, n);
    temp[3] = row[x].query(1, 1, n, y + 1, n);
    ans += min(temp[0], min(temp[1], min(temp[2], temp[3])));
    row[x].update(1, 1, n, y, 0);
    col[y].update(1, 1, n, x, 0);
  }
  printf("%lld\n", ans);
  return 0;
}
