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];
  alias Pos = Tuple!(int, int);
  int[Pos] dictionary;

  alias addBlock = (x,y) {
    if (x < 0) return;
    if (y < 0) return;
    if (x >= W) return;
    if (y >= H) return;
    Pos p = tuple(x,y);
    if(p in dictionary) dictionary[p]++;
    else dictionary[p] = 1;
  };
  foreach (i; 0..N) {
    tmp = readln.split.to!(uint[]);
    auto x = tmp[1]-1;
    auto y = tmp[0]-1;
    for (int dx = -1; dx <= 1; dx++) {
      for (int dy = -1; dy <= 1; dy++) {
        addBlock(x+dx, y+dy);
      }
    }
  }

  foreach (j; 0..10) {
    int count = 0;
    foreach (pos, c; dictionary) {
      if (pos[0] <= 0) continue;
      if (pos[1] <= 0) continue;
      if (pos[0] >= W-1) continue;
      if (pos[1] >= H-1) continue;
      if (c == j) count++;
    }
    writeln(count);
  }
}
