import std.stdio, std.string,std.range, std.conv, std.array, std.algorithm, std.math, std.typecons, std.functional, std.bigint, std.random;

void main() {
  auto tmp = readln.split.to!(uint[]);
  auto H = tmp[0], W = tmp[1], N = tmp[2];
  if (N == 0) {
    writeln(cast(ulong)(W-2)*(H-2));
    foreach (i; 1..10) {
      writeln(0);
    }
    return;
  }
  int[][] blocks = new int[][](W, H);
  foreach (i; 0..N) {
    tmp = readln.split.to!(uint[]);
    auto x = tmp[1]-1;
    auto y = tmp[0]-1;
    auto xMin = x > 0;
    auto xMax = x < W-1;
    auto yMin = y > 0;
    auto yMax = y < H-1;
    blocks[x][y]++;
    if (yMin)
      blocks[x][y-1]++;
    if (yMax)
      blocks[x][y+1]++;
    if (xMin) {
      blocks[x-1][y]++;
      if (yMin) 
        blocks[x-1][y-1]++;
      if (yMax)
        blocks[x-1][y+1]++;
    }
    if (xMax) {
      blocks[x+1][y]++;
      if (yMin)
        blocks[x+1][y-1]++;
      if (yMax)
        blocks[x+1][y+1]++;
    }
  }

  foreach (j; 0..10) {
    int count = 0;
    foreach (x; 1..W-1) {
      foreach (y; 1..H-1) {
        if (blocks[x][y] == j) count++;
      }
    }
    writeln(count);
  }
}
