from heapq import heappush, heappop
DIRS = [(-1, -1), (-1, 0), (-1, 1),
(0, -1), (0, 1),
(1, -1), (1, 0), (1, 1)]
def is_valid(x, y, n, m, blocked):
return 0 <= x < n and 0 <= y < m and (x, y) not in blocked
def path_finder(grid, src, dest, blocked):
n, m = len(grid), len(grid[0])
INF = 10**18
dist = [[INF] * m for _ in range(n)]
sx, sy = src
dx, dy = dest
pq = []
heappush(pq, (0, sx, sy))
dist[sx][sy] = 0
while pq:
cost, x, y = heappop(pq)
if (x, y) == (dx, dy):
return cost
neigh = []
for ddx, ddy in DIRS:
nx, ny = x + ddx, y + ddy
if is_valid(nx, ny, n, m, blocked):
neigh.append(((nx, ny), grid[nx][ny]))
if not neigh:
continue
vals = [v for (_, v) in neigh]
for i, ((nx, ny), val_t) in enumerate(neigh):
if len(vals) == 1:
max_other = None
else:
max_other = max(vals[:i] + vals[i+1:])
if max_other is None:
required = 0
else:
required = max(0, (max_other + 1) - val_t)
new_cost = cost + required
if new_cost < dist[nx][ny]:
dist[nx][ny] = new_cost
heappush(pq, (new_cost, nx, ny))
return -1
N, M = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(N)]
sx, sy = map(int, input().split())
dx, dy = map(int, input().split())
K = int(input())
blocked = set()
for _ in range(K):
bx, by = map(int, input().split())
blocked.add((bx - 1, by - 1))
sx, sy, dx, dy = sx - 1, sy - 1, dx - 1, dy - 1
result = path_finder(grid, (sx, sy), (dx, dy), blocked)
print(result)
ZnJvbSBoZWFwcSBpbXBvcnQgaGVhcHB1c2gsIGhlYXBwb3AKCkRJUlMgPSBbKC0xLCAtMSksICgtMSwgMCksICgtMSwgMSksCiAgICAgICAgKDAsIC0xKSwgICAgICAgICAgKDAsIDEpLAogICAgICAgICgxLCAtMSksICAoMSwgMCksICgxLCAxKV0KCmRlZiBpc192YWxpZCh4LCB5LCBuLCBtLCBibG9ja2VkKToKICAgIHJldHVybiAwIDw9IHggPCBuIGFuZCAwIDw9IHkgPCBtIGFuZCAoeCwgeSkgbm90IGluIGJsb2NrZWQKCmRlZiBwYXRoX2ZpbmRlcihncmlkLCBzcmMsIGRlc3QsIGJsb2NrZWQpOgogICAgbiwgbSA9IGxlbihncmlkKSwgbGVuKGdyaWRbMF0pCiAgICBJTkYgPSAxMCoqMTgKICAgIGRpc3QgPSBbW0lORl0gKiBtIGZvciBfIGluIHJhbmdlKG4pXQogICAgc3gsIHN5ID0gc3JjCiAgICBkeCwgZHkgPSBkZXN0CgogICAgcHEgPSBbXQogICAgaGVhcHB1c2gocHEsICgwLCBzeCwgc3kpKQogICAgZGlzdFtzeF1bc3ldID0gMAoKICAgIHdoaWxlIHBxOgogICAgICAgIGNvc3QsIHgsIHkgPSBoZWFwcG9wKHBxKQogICAgICAgIGlmICh4LCB5KSA9PSAoZHgsIGR5KToKICAgICAgICAgICAgcmV0dXJuIGNvc3QKICAgICAgICBuZWlnaCA9IFtdCiAgICAgICAgZm9yIGRkeCwgZGR5IGluIERJUlM6CiAgICAgICAgICAgIG54LCBueSA9IHggKyBkZHgsIHkgKyBkZHkKICAgICAgICAgICAgaWYgaXNfdmFsaWQobngsIG55LCBuLCBtLCBibG9ja2VkKToKICAgICAgICAgICAgICAgIG5laWdoLmFwcGVuZCgoKG54LCBueSksIGdyaWRbbnhdW255XSkpCgogICAgICAgIGlmIG5vdCBuZWlnaDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICB2YWxzID0gW3YgZm9yIChfLCB2KSBpbiBuZWlnaF0KCiAgICAgICAgZm9yIGksICgobngsIG55KSwgdmFsX3QpIGluIGVudW1lcmF0ZShuZWlnaCk6CiAgICAgICAgICAgIGlmIGxlbih2YWxzKSA9PSAxOgogICAgICAgICAgICAgICAgbWF4X290aGVyID0gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbWF4X290aGVyID0gbWF4KHZhbHNbOmldICsgdmFsc1tpKzE6XSkKCiAgICAgICAgICAgIGlmIG1heF9vdGhlciBpcyBOb25lOgogICAgICAgICAgICAgICAgcmVxdWlyZWQgPSAwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXF1aXJlZCA9IG1heCgwLCAobWF4X290aGVyICsgMSkgLSB2YWxfdCkKCiAgICAgICAgICAgIG5ld19jb3N0ID0gY29zdCArIHJlcXVpcmVkCiAgICAgICAgICAgIGlmIG5ld19jb3N0IDwgZGlzdFtueF1bbnldOgogICAgICAgICAgICAgICAgZGlzdFtueF1bbnldID0gbmV3X2Nvc3QKICAgICAgICAgICAgICAgIGhlYXBwdXNoKHBxLCAobmV3X2Nvc3QsIG54LCBueSkpCgogICAgcmV0dXJuIC0xCgpOLCBNID0gbWFwKGludCwgaW5wdXQoKS5zcGxpdCgpKQpncmlkID0gW2xpc3QobWFwKGludCwgaW5wdXQoKS5zcGxpdCgpKSkgZm9yIF8gaW4gcmFuZ2UoTildCnN4LCBzeSA9IG1hcChpbnQsIGlucHV0KCkuc3BsaXQoKSkKZHgsIGR5ID0gbWFwKGludCwgaW5wdXQoKS5zcGxpdCgpKQpLID0gaW50KGlucHV0KCkpCmJsb2NrZWQgPSBzZXQoKQpmb3IgXyBpbiByYW5nZShLKToKICAgIGJ4LCBieSA9IG1hcChpbnQsIGlucHV0KCkuc3BsaXQoKSkKICAgIGJsb2NrZWQuYWRkKChieCAtIDEsIGJ5IC0gMSkpCnN4LCBzeSwgZHgsIGR5ID0gc3ggLSAxLCBzeSAtIDEsIGR4IC0gMSwgZHkgLSAxCgpyZXN1bHQgPSBwYXRoX2ZpbmRlcihncmlkLCAoc3gsIHN5KSwgKGR4LCBkeSksIGJsb2NrZWQpCnByaW50KHJlc3VsdCk=