#include <bits/stdc++.h>
using namespace std;
char buf[(1 << 24)], *p1 = buf, *p2 = buf;
inline long long read() {
  char c =
      (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 22, stdin), p1 == p2)
           ? EOF
           : *p1++);
  long long x = 0, f = 1;
  while (c<'0' | c> '9') {
    if (c == '-') f = -1;
    c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 22, stdin), p1 == p2)
             ? EOF
             : *p1++);
  }
  while (c >= '0' && c <= '9')
    x = x * 10 + c - '0',
    c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 22, stdin), p1 == p2)
             ? EOF
             : *p1++);
  return x * f;
}
const int maxn = 305;
int n, m, mp[maxn][maxn], color[maxn][maxn];
int cnt[maxn], grads[maxn * maxn * 2];
struct Symbol {
  int x, y, v, s;
  bool operator<(const Symbol& S) const { return s > S.s; }
};
vector<int> allc;
int getidx(int x) {
  return lower_bound(allc.begin(), allc.end(), x) - allc.begin();
}
queue<Symbol> Q;
priority_queue<Symbol> PQ;
vector<Symbol> symbols[maxn * maxn * 2];
int getstep(int x, int y, int a, int b) {
  if (x == a && y == b) return 1;
  int layer = max(abs(a - x), abs(b - y)) + 1;
  int pre_cnt = (2 * layer - 3) * (2 * layer - 3);
  int pre_width = 2 * layer - 3;
  int now_x = x - pre_width / 2 - 1;
  int now_y = y - pre_width / 2 - 1;
  int each_cnt = 2 * layer - 2;
  if (a == now_x && b > now_y && b <= now_y + each_cnt) {
    return pre_cnt + b - now_y;
  } else {
    now_y += each_cnt;
    pre_cnt += each_cnt;
  }
  if (b == now_y && a > now_x && a <= now_x + each_cnt) {
    return pre_cnt + a - now_x;
  } else {
    now_x += each_cnt;
    pre_cnt += each_cnt;
  }
  if (a == now_x && b < now_y && b >= now_y - each_cnt) {
    return pre_cnt + now_y - b;
  } else {
    now_y -= each_cnt;
    pre_cnt += each_cnt;
  }
  if (b == now_y && a < now_x && a >= now_x - each_cnt) {
    return pre_cnt + now_x - a;
  } else {
    now_x -= each_cnt;
    pre_cnt += each_cnt;
  }
  return pre_cnt;
}
void init() {
  allc.push_back(0);
  for (int i = 1; i < maxn; i += 2) {
    cnt[(i + 1) / 2] = i * i;
  }
}
int main() {
  init();
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      scanf("%d", &color[i][j]);
      allc.push_back(color[i][j]);
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      scanf("%d", &mp[i][j]);
      if (mp[i][j] != -1) allc.push_back(mp[i][j]);
    }
  }
  sort(allc.begin(), allc.end());
  allc.erase(unique(allc.begin(), allc.end()), allc.end());
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      color[i][j] = getidx(color[i][j]);
      grads[color[i][j]]++;
      if (mp[i][j] != -1) {
        mp[i][j] = getidx(mp[i][j]);
        symbols[color[i][j]].push_back({i, j, mp[i][j], -1});
      }
    }
  }
  int start_x, start_y;
  scanf("%d%d", &start_x, &start_y);
  long long ans = 0;
  int print = color[start_x][start_y];
  Q.push({start_x, start_y, mp[start_x][start_y], -1});
  while (!Q.empty()) {
    int x = Q.front().x;
    int y = Q.front().y;
    int v = Q.front().v;
    Q.pop();
    if (!print || print == v) continue;
    grads[v] += grads[print];
    ans += grads[print];
    grads[print] = 0;
    for (int i = 0; i < symbols[print].size(); i++) {
      Symbol& S = symbols[print][i];
      PQ.push({S.x, S.y, S.v, getstep(x, y, S.x, S.y)});
    }
    symbols[print].clear();
    while (!PQ.empty()) {
      int nx = PQ.top().x;
      int ny = PQ.top().y;
      int nv = PQ.top().v;
      PQ.pop();
      Q.push({nx, ny, nv, -1});
    }
    print = v;
  }
  printf("%lld\n", ans);
  return 0;
}
