#include <bits/stdc++.h>
using namespace std;
int n, m, q, f[510][510][12][12], Pow[12], sum[510][510][5];
char mp[510][510];
int getsum(int xa, int ya, int xb, int yb, int k) {
  if (xa < 1 || ya < 1 || xb > n || yb > m || xa > xb || ya > yb) return -1;
  return sum[xb][yb][k] - sum[xa - 1][yb][k] - sum[xb][ya - 1][k] +
         sum[xa - 1][ya - 1][k];
}
int Max(int a, int b, int c, int d) { return max(a, max(b, max(c, d))); }
bool check(int x, int y, int k) {
  if (k == 0) return true;
  int a = getsum(x - k + 1, y - k + 1, x, y, 1);
  int b = getsum(x - k + 1, y + 1, x, y + k, 2);
  int c = getsum(x + 1, y - k + 1, x + k, y, 3);
  int d = getsum(x + 1, y + 1, x + k, y + k, 4);
  if (a == k * k && b == k * k && c == k * k && d == k * k) return true;
  return false;
}
int work(int x, int y) {
  int l = 0, r = min(n, m), mid, res;
  while (l <= r) {
    mid = (l + r) >> 1;
    if (check(x, y, mid)) {
      res = mid;
      l = mid + 1;
    } else {
      r = mid - 1;
    }
  }
  return res;
}
void RMQ_init() {
  for (int k = 1; k < 10; k++) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j + Pow[k] - 1 <= m; j++) {
        f[i][j][0][k] = max(f[i][j][0][k - 1], f[i][j + Pow[k - 1]][0][k - 1]);
      }
    }
  }
  for (int k = 1; k < 10; k++) {
    for (int i = 1; i + Pow[k] - 1 <= n; i++) {
      for (int j = 1; j <= m; j++) {
        f[i][j][k][0] = max(f[i][j][k - 1][0], f[i + Pow[k - 1]][j][k - 1][0]);
      }
    }
  }
  for (int k = 1; k < 10; k++) {
    for (int l = 1; l < 10; l++) {
      for (int i = 1; i + Pow[k] - 1 <= n; i++) {
        for (int j = 1; j + Pow[l] - 1 <= m; j++) {
          f[i][j][k][l] =
              Max(f[i][j][k - 1][l - 1], f[i + Pow[k - 1]][j][k - 1][l - 1],
                  f[i][j + Pow[l - 1]][k - 1][l - 1],
                  f[i + Pow[k - 1]][j + Pow[l - 1]][k - 1][l - 1]);
        }
      }
    }
  }
}
bool judge(int xa, int ya, int xb, int yb, int k) {
  if (k == 0) return true;
  if (xa < 1 || ya < 1 || xb > n || yb > m || xa > xb || ya > yb) return false;
  int t1 = 0, t2 = 0;
  while (xa + Pow[t1] - 1 <= xb) t1++;
  while (ya + Pow[t2] - 1 <= yb) t2++;
  t1--, t2--;
  return Max(f[xa][ya][t1][t2], f[xb - Pow[t1] + 1][ya][t1][t2],
             f[xa][yb - Pow[t2] + 1][t1][t2],
             f[xb - Pow[t1] + 1][yb - Pow[t2] + 1][t1][t2]) >= k;
}
int query(int xa, int ya, int xb, int yb) {
  int l = 0, r = min(n, m), mid, res;
  while (l <= r) {
    mid = (l + r) >> 1;
    if (judge(xa + mid - 1, ya + mid - 1, xb - mid, yb - mid, mid)) {
      res = mid;
      l = mid + 1;
    } else {
      r = mid - 1;
    }
  }
  return res * res * 4;
}
int main() {
  Pow[0] = 1;
  for (int i = 1; i <= 10; i++) {
    Pow[i] = (Pow[i - 1] << 1);
  }
  scanf("%d %d %d", &n, &m, &q);
  for (int i = 1; i <= n; i++) {
    scanf("%s", mp[i] + 1);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (mp[i][j] == 'R') sum[i][j][1] = 1;
      if (mp[i][j] == 'G') sum[i][j][2] = 1;
      if (mp[i][j] == 'Y') sum[i][j][3] = 1;
      if (mp[i][j] == 'B') sum[i][j][4] = 1;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      for (int k = 1; k <= 4; k++) {
        sum[i][j][k] +=
            sum[i - 1][j][k] + sum[i][j - 1][k] - sum[i - 1][j - 1][k];
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      f[i][j][0][0] = work(i, j);
    }
  }
  RMQ_init();
  int xa, xb, ya, yb;
  while (q--) {
    scanf("%d %d %d %d", &xa, &ya, &xb, &yb);
    printf("%d\n", query(xa, ya, xb, yb));
  }
  return 0;
}
