This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int w, h, k, l;
  cin >> w >> h >> k >> l;
  int xh, yh, xv, yv;
  cin >> yh >> xh >> yv >> xv;
  vector<string> s(h);
  for (int i = 0; i < h; i++) {
    cin >> s[i];
  }
  int fx, fy;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (s[i][j] == '*') {
        fx = i;
        fy = j;
      }
    }
  }
  vector<vector<int>> cnt(h, vector<int>(w));
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cnt[i][j] = (s[i][j] == 'X' ? 1 : 0);
      if (i > 0) {
        cnt[i][j] += cnt[i - 1][j];
      }
      if (j > 0) {
        cnt[i][j] += cnt[i][j - 1];
      }
      if (i > 0 && j > 0) {
        cnt[i][j] -= cnt[i - 1][j - 1];
      }
    }
  }
  auto GetSum = [&](int x1, int y1, int x2, int y2) {
    int s = cnt[x2][y2];
    if (x1 > 0) {
      s -= cnt[x1 - 1][y2];
    }
    if (y1 > 0) {
      s -= cnt[x2][y1 - 1];
    }
    if (x1 > 0 && y1 > 0) {
      s += cnt[x1 - 1][y1 - 1];
    }
    return s;
  };
  vector<vector<bool>> ch(h, vector<bool>(w));
  vector<vector<bool>> cv(h, vector<bool>(w));
  auto Valid = [&](int x, int y) {
    return 0 <= x && x < h && 0 <= y && y < w && s[x][y] != 'X';
  };
  vector<vector<int>> U(h, vector<int>(w));
  vector<vector<int>> D(h, vector<int>(w));
  vector<vector<int>> L(h, vector<int>(w));
  vector<vector<int>> R(h, vector<int>(w));
  for (int x = 0; x < h; x++) {
    for (int y = 0; y < w; y++) {
      if (s[x][y] == 'X') {
        U[x][y] = D[x][y] = L[x][y] = R[x][y] = -1;
        continue;
      }
      {
        U[x][y] = (int) 1e9;
        int low = max(0, x - l + 1), high = min(x, h - l);
        while (low <= high) {
          int mid = (low + high) >> 1;
          if (GetSum(mid, y, x, y) == 0) {
            U[x][y] = mid;
            high = mid - 1;
          } else {
            low = mid + 1;
          }
        }
      }
      {
        D[x][y] = -1;
        int low = U[x][y], high = min(x, h - l);
        while (low <= high) {
          int mid = (low + high) >> 1;
          if (GetSum(mid, y, mid + l - 1, y) == 0) {
            D[x][y] = mid;
            low = mid + 1;
          } else {
            high = mid - 1;
          }
        }
      }
      {
        L[x][y] = (int) 1e9;
        int low = max(0, y - k + 1), high = min(y, w - k);
        while (low <= high) {
          int mid = (low + high) >> 1;
          if (GetSum(x, mid, x, y) == 0) {
            L[x][y] = mid;
            high = mid - 1;
          } else {
            low = mid + 1;
          }
        }
      }
      {
        R[x][y] = -1;
        int low = L[x][y], high = min(y, w - k);
        while (low <= high) {
          int mid = (low + high) >> 1;
          if (GetSum(x, mid, x, mid + k - 1) == 0) {
            R[x][y] = mid;
            low = mid + 1;
          } else {
            high = mid - 1;
          }
        }
      }
      if (U[x][y] > D[x][y] || L[x][y] > R[x][y]) {
        U[x][y] = D[x][y] = L[x][y] = R[x][y] = -1;
        continue;
      } 
      if (!Valid(U[x][y], y) || !Valid(U[x][y] + l - 1, y) || GetSum(U[x][y], y, U[x][y] + l - 1, y) > 0) {
        U[x][y] = D[x][y] = L[x][y] = R[x][y] = -1;
      }
      if (!Valid(x, L[x][y]) || !Valid(x, L[x][y] + k - 1) || GetSum(x, L[x][y], x, L[x][y] + k - 1) > 0) {
        U[x][y] = D[x][y] = L[x][y] = R[x][y] = -1;
      }
    }
  }
  auto Inter = [&](int l1, int r1, int l2, int r2) {
    return max(l1, l2) <= min(r1, r2);
  };
  int sx = xh, sy = yv;
  vector<vector<bool>> f(h, vector<bool>(w));
  f[sx][sy] = true;
  vector<pair<int, int>> que;
  que.emplace_back(sx, sy);
  for (int b = 0; b < (int) que.size(); b++) {
    int x = que[b].first;
    int y = que[b].second;
    for (int d = 0; d < 4; d++) {
      int nx = x + dx[d];
      int ny = y + dy[d];
      if (!Valid(nx, ny)) {
        continue;
      }
      if (d == 0) {
        if (D[x][y] == x - l + 1 || !Inter(L[x][y], R[x][y], L[nx][ny], R[nx][ny])) {
          continue;
        }
      }
      if (d == 1) {
        if (R[x][y] == y - k + 1 || !Inter(U[x][y], D[x][y], U[nx][ny], D[nx][ny])) {
          continue;
        }
      }
      if (d == 2) {
        if (U[x][y] == x || !Inter(L[x][y], R[x][y], L[nx][ny], R[nx][ny])) {
          continue;
        }
      }
      if (d == 3) {
        if (L[x][y] == y || !Inter(U[x][y], D[x][y], U[nx][ny], D[nx][ny])) {
          continue;
        }
      }
      if (Valid(nx, ny) && !f[nx][ny]) {
        f[nx][ny] = true;
        que.emplace_back(nx, ny);
      }
    }
  }
  cout << (f[fx][fy] ? "YES" : "NO") << '\n';
  return 0;
}
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:178:16: warning: 'fx' may be used uninitialized in this function [-Wmaybe-uninitialized]
  178 |   cout << (f[fx][fy] ? "YES" : "NO") << '\n';
      |                ^| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |