from collections import deque H, W, sx, sy = map(int, input().split()) sx -= 1 sy -= 1 S = [input() for _ in range(H)] Q = int(input()) gx = [0] * Q gy = [0] * Q T = [0] * Q for i in range(Q): gx[i], gy[i], T[i] = map(int, input().split()) gx[i] -= 1 gy[i] -= 1 dx = [1, 1, 0, -1, -1, -1, 0, 1] dy = [0, 1, 1, 1, 0, -1, -1, -1] movable = False for i in range(8): nx = sx + dx[i] ny = sy + dy[i] if 0 <= nx < H and 0 <= ny < W: if S[nx][ny] == '.': movable = True if not movable: for _ in range(Q): print("No") exit() INF = 10 ** 9 + 7 dist = [[[[INF] * 2 for _ in range(9)] for _ in range(W)] for _ in range(H)] visited = [[[[False] * 2 for _ in range(9)] for _ in range(W)] for _ in range(H)] dq = deque() dq.appendleft((sx, sy, 8, 0)) dist[sx][sy][8][0] = 0 while dq: px, py, direction, parity = dq.popleft() if visited[px][py][direction][parity]: continue visited[px][py][direction][parity] = True cur = dist[px][py][direction][parity] for ndir in range(8): nx = px + dx[ndir] ny = py + dy[ndir] if not (0 <= nx < H and 0 <= ny < W): continue if S[nx][ny] == '#': continue if ndir == direction: if cur < dist[nx][ny][ndir][parity]: dist[nx][ny][ndir][parity] = cur dq.appendleft((nx, ny, ndir, parity)) np = parity ^ 1 if cur + 1 < dist[nx][ny][ndir][np]: dist[nx][ny][ndir][np] = cur + 1 dq.append((nx, ny, ndir, np)) for i in range(Q): target = T[i] % 2 best = INF for d in range(8): best = min(best, dist[gx[i]][gy[i]][d][target]) if best <= T[i]: print("Yes") else: print("No")