#include <bits/stdc++.h>
using namespace std;
const int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
const int N = 1005, M = 1010000;
int n, m, Q, nd, id[N][N];
int fa[M], flg[M];
int vis[M], axib[M], T;
vector<int> e[M];
set<int> S[M], adj[N][N];
char s[N][N];
void init(int x) {
  if (vis[x] == T) return;
  vis[x] = T;
  e[x].resize(0);
}
void add_edge(int x, int y) {
  init(x);
  init(y);
  e[x].push_back(y);
  e[y].push_back(x);
}
void bfs(int S, int *q) {
  axib[S] = ++*axib;
  int h = 0, t = 1;
  q[1] = S;
  while (h != t) {
    int x = q[++h];
    for (auto i : e[x])
      if (axib[i] != *axib) {
        q[++t] = i;
        axib[i] = *axib;
      }
  }
  *q = t;
}
int get(int x) { return x == fa[x] ? x : fa[x] = get(fa[x]); }
int main() {
  scanf("%d%d%d", &n, &m, &Q);
  for (int i = (int)(0); i <= (int)(n + 1); i++)
    for (int j = (int)(0); j <= (int)(m + 1); j++) s[i][j] = '#';
  for (int i = (int)(1); i <= (int)(n); i++) scanf("%s", s[i] + 1);
  for (int i = (int)(1); i <= (int)(n); i++) s[i][m + 1] = '#';
  for (int i = (int)(0); i <= (int)(1); i++)
    for (int j = (int)(0); j <= (int)(1); j++) s[i][j] = s[i + n][j + m] = '.';
  for (int i = (int)(0); i <= (int)(n + 1); i++)
    for (int j = (int)(0); j <= (int)(m + 1); j++) id[i][j] = ++nd, fa[nd] = nd;
  for (int i = (int)(0); i <= (int)(n + 1); i++)
    for (int j = (int)(0); j <= (int)(m + 1); j++)
      for (int d = (int)(0); d <= (int)(7); d++) {
        if (s[i][j] != '#') continue;
        int ni = i + dx[d], nj = j + dy[d];
        if (i < 0 || i > n + 1 || j < 0 || j > m + 1 || s[ni][nj] != '#')
          continue;
        fa[get(id[i][j])] = get(id[ni][nj]);
      }
  int SS = get(id[0][m + 1]);
  int TT = get(id[n + 1][0]);
  assert(SS != TT);
  for (int i = (int)(1); i <= (int)(n); i++)
    for (int j = (int)(1); j <= (int)(m); j++) {
      set<int> &tmp = adj[i][j];
      if (s[i][j] == '#' || (i == 1 && j == 1) || (i == n && j == m)) continue;
      for (int d = (int)(0); d <= (int)(7); d++) {
        int ni = i + dx[d], nj = j + dy[d];
        if (i < 0 || i > n + 1 || j < 0 || j > m + 1 || s[ni][nj] != '#')
          continue;
        tmp.insert(get(id[ni][nj]));
      }
      for (auto p1 : tmp)
        for (auto p2 : tmp) {
          assert(p1 != SS || p2 != TT);
          if (p1 != p2) S[p1].insert(p2);
        }
    }
  while (Q--) {
    ++T;
    int k, X[15], Y[15];
    scanf("%d", &k);
    for (int i = (int)(1); i <= (int)(k); i++) {
      int x, y;
      scanf("%d%d", &x, &y);
      s[X[i] = x][Y[i] = y] = '#';
      for (int d = (int)(0); d <= (int)(7); d++) {
        int nx = x + dx[d], ny = y + dy[d];
        if (nx < 0 || nx > n + 1 || ny < 0 || ny > m + 1) continue;
        if (s[nx][ny] == '#')
          add_edge(get(id[x][y]), get(id[nx][ny]));
        else {
          for (auto k : adj[nx][ny]) {
            S[k].insert(id[x][y]);
            S[id[x][y]].insert(k);
          }
          adj[nx][ny].insert(id[x][y]);
        }
      }
    }
    static int qs[105], qt[105];
    init(SS);
    init(TT);
    bfs(SS, qs);
    bfs(TT, qt);
    bool flag = 0;
    for (int i = (int)(1); i <= (int)(*qs); i++)
      if (qs[i] == TT) flag = 1;
    for (int i = (int)(1); i <= (int)(*qs); i++)
      for (int j = (int)(1); j <= (int)(*qt); j++)
        if (S[qs[i]].find(qt[j]) != S[qs[i]].end()) flag = 1;
    puts(flag ? "NO" : "YES");
    fflush(stdout);
    for (int i = (int)(1); i <= (int)(k); i++) {
      int x = X[i], y = Y[i];
      s[X[i]][Y[i]] = '.';
      for (int d = (int)(0); d <= (int)(7); d++) {
        int nx = x + dx[d], ny = y + dy[d];
        if (nx < 0 || nx > n + 1 || ny < 0 || ny > m + 1) continue;
        if (s[nx][ny] == '#')
          ;
        else {
          for (auto k : adj[nx][ny]) {
            S[k].erase(id[x][y]);
            S[id[x][y]].erase(k);
          }
          adj[nx][ny].erase(id[x][y]);
        }
      }
    }
  }
}
