#include <bits/stdc++.h>
using namespace std;
long long fpm(long long b, long long e, long long m) {
  long long t = 1;
  for (; e; e >>= 1, b = b * b % m) e & 1 ? t = t * b % m : 0;
  return t;
}
template <class T>
inline bool chkmin(T &a, T b) {
  return a > b ? a = b, true : false;
}
template <class T>
inline bool chkmax(T &a, T b) {
  return a < b ? a = b, true : false;
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class edge>
struct Graph {
  vector<vector<edge> > adj;
  Graph(int n) {
    adj.clear();
    adj.resize(n + 5);
  }
  Graph() { adj.clear(); }
  void resize(int n) { adj.resize(n + 5); }
  void adde(int s, edge e) { adj[s].push_back(e); }
  int deg(int v) { return adj[v].size(); }
  vector<edge> &operator[](int t) { return adj[t]; }
};
const int maxn = 330, TRANSPARENT = -2;
int sx, sy;
int a[maxn][maxn], b[maxn][maxn];
map<int, vector<pair<int, int> > > syms;
map<int, int> panel, ufs, rep;
int calc(int x, int y) {
  x -= sx, y -= sy;
  int ret = 0, k = max(abs(x), abs(y));
  ret = sqr(2 * k - 1) - 1;
  if (x == -k && -k < y) return ret + y + k;
  ret += k << 1;
  if (y == +k && -k < x) return ret + x + k;
  ret += k << 1;
  if (x == +k && -k < y) return ret - y + k;
  ret += k << 1;
  return ret - x + k;
}
int cmp(pair<int, int> a, pair<int, int> b) {
  return calc(a.first, a.second) < calc(b.first, b.second);
}
int find(int t) { return ufs[t] ? ufs[t] = find(ufs[t]) : t; }
int main() {
  ios_base::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) cin >> a[i][j], ++panel[a[i][j]];
  for (int i = 1; i <= n; ++i)
    for (int j = 1, x; j <= m; ++j) {
      cin >> x, b[i][j] = x;
      if (x != -1 && a[i][j]) syms[a[i][j]].push_back(make_pair(i, j));
    }
  cin >> sx >> sy;
  if (b[sx][sy] == -1) return cout << 0 << endl, 0;
  long long ans = 0;
  queue<pair<int, int> > Q;
  Q.push(make_pair(sx, sy));
  for (; !Q.empty(); Q.pop()) {
    sx = Q.front().first, sy = Q.front().second;
    int now = b[sx][sy], old = find(a[sx][sy]);
    if (!now) now = TRANSPARENT;
    if (!old) old = TRANSPARENT;
    if (!rep.count(old)) rep[old] = old;
    if (rep[old] == now || rep[old] == TRANSPARENT) continue;
    ans += panel[old];
    ({}), ({}), ({}), ({}), ({}), ({});
    if (find(now) == old)
      rep[old] = now;
    else
      ufs[old] = now, panel[now] += panel[old];
    vector<pair<int, int> > &sym = syms[old];
    sort((sym).begin(), (sym).end(), cmp);
    for (__typeof__((sym).begin()) it = (sym).begin(); it != (sym).end(); ++it)
      if (it->first != sx || it->second != sy) Q.push(*it);
    sym.clear();
  }
  cout << ans << endl;
  return 0;
}
