#include #include #include #include using namespace std; int main(){ int H, W, sx, sy; cin >> H >> W >> sx >> sy; sx--; sy--; vector S(H); for (int i = 0; i < H; i++){ cin >> S[i]; } int Q; cin >> Q; vector gx(Q); vector gy(Q); vector T(Q); for (int i = 0; i < Q; i++){ cin >> gx[i] >> gy[i] >> T[i]; gx[i]--; gy[i]--; } const int INF = 1000000002; vector>> dist(H, vector>(W, vector(2, INF))); dist[sx][sy][0] = 0; queue> que; que.push(make_tuple(sx, sy, 0)); vector dx = {1, 1, 0, -1, -1, -1, 0, 1}; vector dy = {0, 1, 1, 1, 0, -1, -1, -1}; bool movable = false; for (int i = 0; i < 8; i++){ if (sx + dx[i] >= 0 && sx + dx[i] < H && sy + dy[i] >= 0 && sy + dy[i] < W){ if (S[sx + dx[i]][sy + dy[i]] == '.'){ movable = true; } } } if (!movable){ for (int i = 0; i < Q; i++){ cout << "No" << endl; } return 0; } while (que.size()){ tuple tp = que.front(); que.pop(); int px = get<0>(tp); int py = get<1>(tp); int id = get<2>(tp); for (int i = 0; i < 8; i++){ int nx = px; int ny = py; while (true){ nx += dx[i]; ny += dy[i]; if (nx < 0 || nx >= H || ny < 0 || ny >= W){ break; } if (S[nx][ny] == '#'){ break; } if (dist[nx][ny][id ^ 1] == INF){ dist[nx][ny][id ^ 1] = dist[px][py][id] + 1; que.push(make_tuple(nx, ny, id ^ 1)); } } } } for (int i = 0; i < Q; i++){ if (dist[gx[i]][gy[i]][T[i] % 2] <= T[i]){ cout << "Yes" << endl; } else{ cout << "No" << endl; } } }