#include <bits/stdc++.h>
using namespace std;
const int L = 1005;
const int N = L * L;
const int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
char s[L][L];
vector<int> V[N];
set<int> mp[N];
int id[L][L], fa[N];
int n, m, q, S, T;
int X[N], Y[N];
int top, cnt;
int sta[N * 2];
int get(int x) { return fa[x] == x ? x : fa[x] = get(fa[x]); }
int get2(int x) {
  for (; x != fa[x]; x = fa[x])
    ;
  return x;
}
void merge(int x, int y) {
  x = get(x);
  y = get(y);
  if (x != y) fa[x] = y;
}
void merge2(int x, int y) {
  x = get2(x);
  y = get2(y);
  if (x != y) {
    sta[++top] = x;
    sta[++top] = -y;
    fa[x] = y;
    V[y].push_back(-x);
  }
}
void dfs(int x, vector<int> &v) {
  for (int i = (0); i <= (V[x].size() - 1); i++) {
    int y = V[x][i];
    if (y > 0)
      v.push_back(y);
    else
      dfs(-y, v);
  }
}
int solve() {
  int p;
  scanf("%d", &p);
  for (int i = (1); i <= (p); i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    if (s[x][y] == '#') continue;
    for (int k = (0); k <= (7); k++) {
      int X = x + dx[k], Y = y + dy[k];
      if (s[X][Y] != '#') continue;
      merge2(id[x][y], id[X][Y]);
    }
    if (x == n || y == 1) merge2(S, id[x][y]);
    if (x == 1 || y == m) merge2(T, id[x][y]);
    s[x][y] = '#';
    X[++X[0]] = x;
    Y[X[0]] = y;
  }
  if (get2(S) == get2(T)) return 0;
  vector<int> Vs, Vt;
  dfs(get2(S), Vs);
  dfs(get2(T), Vt);
  for (int i = (0); i <= (Vs.size() - 1); i++)
    for (int j = (0); j <= (Vt.size() - 1); j++) {
      int a = Vs[i], b = Vt[j];
      if (a > b) swap(a, b);
      if (mp[a].find(b) != mp[a].end()) return 0;
    }
  for (int i = (1); i <= (X[0]); i++) {
    int x = X[i], y = Y[i];
    for (int p = (x - 2); p <= (x + 2); p++)
      for (int q = (y - 2); q <= (y + 2); q++) {
        if (p < 0 || p > n + 1 || q < 0 || q > m + 1) continue;
        if (get2(id[x][y]) == get2(S) && get2(id[p][q]) == get2(T)) return 0;
        if (get2(id[x][y]) == get2(T) && get2(id[p][q]) == get2(S)) return 0;
      }
  }
  return 1;
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = (1); i <= (n); i++) scanf("%s", s[i] + 1);
  if (s[1][1] == '#' || s[n][m] == '#') {
    for (int i = (1); i <= (q); i++) puts("NO");
    return 0;
  }
  S = ++cnt;
  T = ++cnt;
  for (int i = (2); i <= (n); i++) id[i][0] = S, s[i][0] = '#';
  for (int i = (1); i <= (m - 1); i++) id[n + 1][i] = S, s[n + 1][i] = '#';
  for (int i = (2); i <= (m); i++) id[0][i] = T, s[0][i] = '#';
  for (int i = (1); i <= (n - 1); i++) id[i][m + 1] = T, s[i][m + 1] = '#';
  for (int i = (1); i <= (n); i++)
    for (int j = (1); j <= (m); j++) id[i][j] = ++cnt;
  for (int i = (1); i <= (cnt); i++) fa[i] = i;
  for (int i = (1); i <= (n); i++)
    for (int j = (1); j <= (m); j++)
      if (s[i][j] == '#')
        for (int k = (0); k <= (7); k++) {
          int x = i + dx[k], y = j + dy[k];
          if (s[x][y] == '#') merge(id[i][j], id[x][y]);
        }
  for (int i = (1); i <= (n); i++)
    for (int j = (1); j <= (m); j++)
      if (s[i][j] == '.') {
        if (i + j == 2) continue;
        if (i + j == n + m) continue;
        for (int k = (0); k <= (7); k++) {
          int x = i + dx[k], y = j + dy[k];
          if (s[x][y] != '#') continue;
          for (int l = (k + 1); l <= (7); l++) {
            int X = i + dx[l], Y = j + dy[l];
            if (s[X][Y] != '#') continue;
            int a = get(id[x][y]), b = get(id[X][Y]);
            if (a == b) continue;
            if (a > b) swap(a, b);
            mp[a].insert(b);
          }
        }
      }
  for (int i = (1); i <= (cnt); i++)
    if (get(i) == i) V[i].push_back(i);
  for (int i = (1); i <= (q); i++) {
    puts(solve() ? "YES" : "NO");
    fflush(stdout);
    for (int j = (1); j <= (X[0]); j++) s[X[j]][Y[j]] = '.';
    X[0] = 0;
    for (; top; top--) {
      int x = sta[top];
      if (x > 0)
        fa[x] = x;
      else
        V[-x].pop_back();
    }
  }
}
