#include <bits/stdc++.h>
const long long N = 1010;
const long long INF = 1e9;
using namespace std;
long long Q;
long long n[N], m[N];
long long s[N][N];
void READ() {
  char x;
  scanf("%lld%lld%lld", &n[0], &m[0], &Q);
  for (long long i = 1; i <= n[0]; i++) {
    scanf("\n");
    for (long long j = 1; j <= m[0]; j++) {
      scanf("%c", &x);
      s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + x - '0';
    }
  }
}
void INIT() {
  for (long long i = 0; n[i] <= INF && m[i] <= INF; i++)
    n[i + 1] = n[i] << 1, m[i + 1] = m[i] << 1;
}
long long GET(long long pos, long long x, long long y) {
  if (pos == -1) return s[x][y];
  if (x <= n[pos] && y <= m[pos]) return GET(pos - 1, x, y);
  if (x <= n[pos] && y > m[pos]) {
    if (pos)
      return x * (y - m[pos]) - GET(pos - 1, x, y - m[pos]) + x * m[pos - 1];
    return x * (y - m[pos]) - GET(pos - 1, x, y - m[pos]) + s[x][m[0]];
  }
  if (x > n[pos] && y <= m[pos]) {
    if (pos)
      return y * (x - n[pos]) - GET(pos - 1, x - n[pos], y) + y * n[pos - 1];
    return y * (x - n[pos]) - GET(pos - 1, x - n[pos], y) + s[n[0]][y];
  }
  if (x > n[pos] && y > m[pos]) {
    if (pos)
      return GET(pos - 1, x - n[pos], y - m[pos]) +
             (x * y - (x - n[pos]) * (y - m[pos])) / 2;
    long long sum = GET(pos - 1, x - n[pos], y - m[pos]) + s[n[0]][m[0]];
    sum += n[0] * (y - m[pos]) - GET(pos - 1, n[0], y - m[pos]);
    sum += m[0] * (x - n[pos]) - GET(pos - 1, x - n[pos], m[0]);
    return sum;
  }
}
long long CHK(long long x, long long y) {
  long long pos = 0;
  while (!(n[pos] * 2 >= x && m[pos] * 2 >= y)) pos++;
  return GET(pos, x, y);
}
void SOLVE() {
  long long xa, ya, xb, yb;
  scanf("%lld%lld%lld%lld", &xa, &ya, &xb, &yb);
  printf("%lld\n",
         CHK(xb, yb) - CHK(xa - 1, yb) - CHK(xb, ya - 1) + CHK(xa - 1, ya - 1));
}
int main() {
  READ();
  INIT();
  while (Q--) SOLVE();
  return 0;
}
