#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); var h = I(); var w = I(); var (sx, sy) = (I(), I()); var g = new bool[h + 2, w + 2]; for (var i = 0; i < h; i++) { var row = I(); for (var j = 0; j < w; j++) g[i + 1, j + 1] = row[j] == '.'; } var qz = Range(I(), () => (I(), I(), I())); var d1 = new int[h + 2, w + 2]; var d2 = new int[h + 2, w + 2]; for (var i = 1; i <= h; i++) for (var j = 1; j <= w; j++) d1[i, j] = d2[i, j] = int.MaxValue / 2; d1[sx, sy] = 0; var q = new Queue<(int, int, int)>(); q.Enqueue((sx, sy, 0)); while (q.Count > 0) { var (qx, qy, qd) = q.Dequeue(); if (qd > d2[qx, qy]) continue; var nd = qd + 1; for (var dx = -1; dx <= 1; dx++) for (var dy = -1; dy <= 1; dy++) { if ((dx, dy) == (0, 0)) continue; var (x, y) = (qx, qy); while (true) { x += dx; y += dy; if (!g[x, y]) break; if (d1[x, y] > nd) { d1[x, y] = nd; q.Enqueue((x, y, nd)); continue; } else if (d1[x, y] < nd && d2[x, y] > nd) { d2[x, y] = nd; q.Enqueue((x, y, nd)); continue; } } } } var ans = new List(); foreach (var (x, y, t) in qz) { var dq1 = d1[x, y]; var dq2 = d2[x, y]; if (t >= dq1 && (t - dq1) % 2 == 0) ans.Add("Yes"); else if (t >= dq2 && (t - dq2) % 2 == 0) ans.Add("Yes"); else ans.Add("No"); } Console.WriteLine(string.Join(Environment.NewLine, ans));