#include <bits/stdc++.h>
using namespace std;
const int MAX_M = 1000, MAX_N = 1000;
const int MAX_K = 100000;
int m, n;
int k;
char field[MAX_N];
struct type {
  int j, o, i;
};
type table[MAX_M + 1][MAX_N + 1];
type res[MAX_K];
int main() {
  scanf("%d %d", &m, &n);
  scanf("%d", &k);
  for (int y = 0; y < m; y++) {
    scanf("%s", field);
    for (int x = 0; x < n; x++) {
      table[y + 1][x + 1].j =
          table[y][x + 1].j + table[y + 1][x].j - table[y][x].j;
      table[y + 1][x + 1].o =
          table[y][x + 1].o + table[y + 1][x].o - table[y][x].o;
      table[y + 1][x + 1].i =
          table[y][x + 1].i + table[y + 1][x].i - table[y][x].i;
      switch (field[x]) {
        case 'J':
          table[y + 1][x + 1].j++;
          break;
        case 'O':
          table[y + 1][x + 1].o++;
          break;
        case 'I':
          table[y + 1][x + 1].i++;
          break;
      }
    }
  }
  for (int p = 0; p < k; p++) {
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);
    res[p].j = table[c][d].j - table[c][b - 1].j - table[a - 1][d].j +
               table[a - 1][b - 1].j;
    res[p].o = table[c][d].o - table[c][b - 1].o - table[a - 1][d].o +
               table[a - 1][b - 1].o;
    res[p].i = table[c][d].i - table[c][b - 1].i - table[a - 1][d].i +
               table[a - 1][b - 1].i;
  }
  for (int p = 0; p < k; p++) {
    printf("%d %d %d\n", res[p].j, res[p].o, res[p].i);
  }
  return 0;
}
