#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int MAXN = 1000005;
template <typename T>
void read(T &x) {
  T flag = 1;
  char ch = getchar();
  for (; '0' > ch || ch > '9'; ch = getchar())
    if (ch == '-') flag = -1;
  for (x = 0; '0' <= ch && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  x *= flag;
}
int n, m;
int q;
char mp[1005][1005];
int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
bool check(int i, int j) {
  if (i < 1 || i > n || j < 1 || j > m) return false;
  if (mp[i][j] == '.') return false;
  return true;
}
int get(int i, int j) {
  if (j < 1 || i > n) return 0;
  if (i < 1 || j > m) return n * m + 1;
  return (i - 1) * m + j;
}
int fa[MAXN];
int Find(int x) { return fa[x] == x ? x : fa[x] = Find(fa[x]); }
void merge(int x, int y) { fa[Find(x)] = fa[Find(y)]; }
int Find2(int x) { return fa[x] == x ? x : Find2(fa[x]); }
int cx[MAXN], cy[MAXN];
int s, t;
set<pair<int, int> > S;
int stk[MAXN], top;
int main() {
  read(n);
  read(m);
  read(q);
  for (int i = 1; i <= n; i++) {
    scanf("%s", mp[i] + 1);
    for (int j = 1; j <= m; j++) {
      fa[get(i, j)] = get(i, j);
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (mp[i][j] == '.') continue;
      for (int k = 0; k < 4; k++) {
        if (check(i + dx[k], j + dy[k])) {
          merge(get(i, j), get(i + dx[k], j + dy[k]));
        }
      }
    }
  }
  s = 0;
  t = n * m + 1;
  fa[s] = s;
  fa[t] = t;
  for (int i = 1; i <= n; i++) {
    if (mp[i][1] == '#') merge(s, get(i, 1));
    if (mp[i][m] == '#') merge(t, get(i, m));
  }
  for (int i = 1; i <= m; i++) {
    if (mp[1][i] == '#') merge(t, get(1, i));
    if (mp[n][i] == '#') merge(s, get(n, i));
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (i == 1 && j == 1) continue;
      if (i == n && j == m) continue;
      for (int k = 0; k < 8; k++) {
        for (int l = k + 1; l < 8; l++) {
          int x = Find(get(i + dx[k], j + dy[k])),
              y = Find(get(i + dx[l], j + dy[l]));
          S.insert(make_pair(min(x, y), max(x, y)));
          if (x == Find(s) && y == Find(t)) {
            while (q--) {
              puts("NO");
              fflush(stdout);
            }
            return 0;
          }
          if (x == Find(t) && y == Find(s)) {
            while (q--) {
              puts("NO");
              fflush(stdout);
            }
            return 0;
          }
        }
      }
    }
  }
  while (q--) {
    int K;
    read(K);
    top = 0;
    for (int i = 1; i <= K; i++) {
      read(cx[i]);
      read(cy[i]);
      mp[cx[i]][cy[i]] = '#';
      stk[++top] = Find2(get(cx[i], cy[i]));
      for (int k = 0; k < 8; k++) {
        stk[++top] = Find2(get(cx[i] + dx[k], cy[i] + dy[k]));
        if (get(cx[i] + dx[k], cy[i] + dy[k]) == s ||
            get(cx[i] + dx[k], cy[i] + dy[k]) == t ||
            mp[cx[i] + dx[k]][cy[i] + dy[k]] == '#') {
          fa[Find2(get(cx[i], cy[i]))] =
              Find2(get(cx[i] + dx[k], cy[i] + dy[k]));
        }
      }
    }
    stk[++top] = Find2(s), stk[++top] = Find2(t);
    sort(stk + 1, stk + 1 + top);
    top = unique(stk + 1, stk + 1 + top) - stk - 1;
    bool ans = true;
    for (int i = 1; i <= top && ans; i++) {
      int ii = Find2(stk[i]);
      if (ii != Find2(s)) continue;
      for (int j = 1; j <= top && ans; j++) {
        int jj = Find2(stk[j]);
        if (jj != Find2(t)) continue;
        if (S.find(make_pair(min(stk[i], stk[j]), max(stk[i], stk[j]))) !=
            S.end()) {
          ans = false;
        }
      }
    }
    if (ans)
      puts("YES");
    else
      puts("NO");
    fflush(stdout);
    for (int i = 1; i <= K; i++) mp[cx[i]][cy[i]] = '.';
    for (int i = 1; i <= top; i++) {
      fa[stk[i]] = stk[i];
    }
  }
  return 0;
}
