#include <bits/stdc++.h>
using namespace std;
void prepare() {}
int Ox, Oy, spiral[605][605];
struct G {
  int x, y, c;
  G() {}
  G(int x, int y, int c) : x(x), y(y), c(c) {}
  bool operator<(const G &g) const {
    return spiral[x - Ox + 300][y - Oy + 300] <
           spiral[g.x - Ox + 300][g.y - Oy + 300];
  }
  bool operator==(const G &g) const { return x == g.x && y == g.y && c == g.c; }
};
int n, m, sx, sy;
int a[305][305], p[300 * 305], b[305][305], color[300 * 305], size[300 * 305];
vector<G> g[300 * 305];
map<int, int> pred;
G q[300 * 305];
int sq;
bool used[305][305];
void prespiral() {
  int x = 300, y = 300, cur = 0;
  spiral[x][y] = ++cur;
  for (int i = 1;; i++) {
    int dx = (i & 1) ? -1 : 1;
    int dy = (i & 1) ? 1 : -1;
    for (int j = 0; j < i; j++) {
      x += dx;
      if (x < 0 || x >= 605) return;
      spiral[x][y] = ++cur;
    }
    for (int j = 0; j < i; j++) {
      y += dy;
      if (y < 0 || y >= 605) return;
      spiral[x][y] = ++cur;
    }
  }
}
int findset(int k) {
  if (p[k] != k) p[k] = findset(p[k]);
  return p[k];
}
void unite(int a, int b) {
  int fa = findset(a);
  int fb = findset(b);
  if (fa != fb) {
    p[fb] = fa;
    g[fa].insert(g[fa].end(), (g[fb]).begin(), (g[fb]).end());
    g[fb].clear();
    if (color[fa] != color[fb]) {
      pred[color[fb]] = -1;
      color[fb] = color[fa];
    }
    size[fa] += size[fb];
    size[fb] = 0;
  }
}
void read() {
  scanf("%d%d", &n, &m);
  for (int i = (0); i < (((n))); i++) {
    for (int j = (0); j < (((m))); j++) {
      scanf("%d", &a[i][j]);
      p[i * m + j] = i * m + j;
      size[i * m + j] = 1;
      color[i * m + j] = a[i][j];
      pred[a[i][j]] = -1;
    }
  }
  for (int i = (0); i < (((n))); i++) {
    for (int j = (0); j < (((m))); j++) {
      scanf("%d", &b[i][j]);
      pred[b[i][j]] = -1;
      if (b[i][j] >= 0) g[i * m + j].push_back(G(i, j, b[i][j]));
    }
  }
  scanf("%d%d", &sx, &sy);
  sx--;
  sy--;
}
void solve() {
  prespiral();
  read();
  for (int i = (0); i < (((n))); i++) {
    for (int j = (0); j < (((m))); j++) {
      if (pred[a[i][j]] < 0)
        pred[a[i][j]] = i * m + j;
      else
        unite(pred[a[i][j]], i * m + j);
    }
  }
  long long res = 0;
  q[sq++] = G(sx, sy, b[sx][sy]);
  used[sx][sy] = true;
  for (int cl = 0; cl < sq; cl++) {
    G t = q[cl];
    int f = findset(t.x * m + t.y);
    if (color[f] && color[f] != t.c) {
      res += size[f];
      Ox = t.x;
      Oy = t.y;
      sort((g[f]).begin(), (g[f]).end());
      for (int i = (0); i < ((((int)(g[f]).size()))); i++) {
        G d = g[f][i];
        if (!used[d.x][d.y]) {
          q[sq++] = d;
          used[d.x][d.y] = true;
        }
      }
      g[f].clear();
      if (pred[t.c] < 0) {
        pred[t.c] = f;
        pred[color[f]] = -1;
        color[f] = t.c;
      } else
        unite(pred[t.c], t.x * m + t.y);
    }
  }
  printf("%I64d\n", res);
}
int main() {
  prepare();
  solve();
  return 0;
}
