// Slower C++ solution:
#include<bits/stdc++.h>



using namespace std;

#define REPP(i,a,b,c) for(int i=a; i<=b; i+=c)

#define REP(i,a,b) REPP(i,a,b,1)

#define REVV(i,a,b,c) for(int i=a; i>=b; i-=c)

#define REV(i,a,b) REVV(i,a,b,1)

#define FOR(i,a) REP(i,0,(int)a-1)

#define FORD(i,a) REV(i,(int)a-1,0)

#define PB push_back

#define POB pop_back

#define MP make_pair

#define FI first

#define SE second

typedef long long ll;

typedef unsigned long long ull;

typedef pair < int , int > pii;

typedef vector < int > vi;

typedef vector < pii > vii;

typedef vector < ll > vl;



const double EPS = 1e-9;

const double PI = acos(-1);

const int INF = 1e9;

const ll MOD = 1e9 + 7;



ll addMod(ll a, ll b){

	return (a+b) % MOD;

}



ll mulMod(ll a, ll b){

	return (a*b) % MOD;

}



/////////////////////////////////////////////////////////



ll cnt[15];

ll h,w,n;

map < pii , bool > flag;

int dy[] = {-2,-2,-2,-1,-1,-1,0,0,0};

int dx[] = {-2,-1,0,-2,-1,0,-2,-1,0};



bool inRange(int y, int x){

	return y > 0 && y <= h && x > 0 && x <= w;

}



int getCnt(int ty, int tx, int ny, int nx){

	int ret = 0;

	REP(i,ty,ny){

		REP(j,tx,nx){

			if(flag[MP(i,j)]) ret++;

		}

	}

	return ret;

}



void update(int y, int x){

	FOR(i,9){

		int ty = y + dy[i];

		int tx = x + dx[i];

		int ny = ty + 2;

		int nx = tx + 2;

		if(inRange(ty,tx) && inRange(ny,nx)){

			int bef = getCnt(ty,tx,ny,nx);

			cnt[bef]--;

			cnt[bef+1]++;

		}

	}

	flag[MP(y,x)] = true;

}



int main(){

	ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

	cin >> h >> w >> n;

	cnt[0] = (h-2) * (w - 2);

	int y,x;

	FOR(i,n){

		cin >> y >> x;

		update(y,x);

	}

	FOR(i,10) cout << cnt[i] << endl;

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.1221552312346401x):
#include <cmath>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <set>

using std::min; using std::max;

using std::swap; using std::sort;

using std::set;

typedef long long ll;

typedef std::pair<int, int> pii;



template<typename T>

void read(T &x) {

	int flag = 1; x = 0; char ch = getchar();

	while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }

	while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();

	x *= flag;

}



const int _ = 1e5 + 10;

const int dx[30] = {0,

					-2, -1, 0, 1, 2,

					-2, -1, 0, 1, 2,

					-2, -1, 0, 1, 2,

					-2, -1, 0, 1, 2,

					-2, -1, 0, 1, 2};

const int dy[30] = {0,

					2, 2, 2, 2, 2,

					1, 1, 1, 1, 1,

					0, 0, 0, 0, 0,

					-1, -1, -1, -1, -1,

					-2, -2, -2, -2, -2};

ll h, w, n; int now; int v[30];

struct node { int x, y; } p[_];

ll r[10];

set<pii> S;



bool f(int dx, int dy) {

	int x = p[now].x + dx, y = p[now].y + dy;

	return S.find((pii){x, y}) != S.end();

}



bool chk(int x, int y) {

	return x >= 1 && y >= 1 && x <= h && y <= w;

}



int main () {

	read(h), read(w), read(n);

	for(int i = 1; i <= n; ++i) {

		read(p[i].x), read(p[i].y);

		S.insert((pii){p[i].x, p[i].y});

	}

	for(int i = 1; i <= n; ++i) {

		now = i;

		for(int j = 1; j <= 25; ++j) v[j] = f(dx[j], dy[j]);

		if(chk(p[now].x - 2, p[now].y + 2) && chk(p[now].x, p[now].y))

		++r[v[1] + v[2] + v[3] + v[6] + v[7] + v[8] + v[11] + v[12] + v[13]];

		

		if(chk(p[now].x - 1, p[now].y + 2) && chk(p[now].x + 1, p[now].y))

		++r[v[2] + v[3] + v[4] + v[7] + v[8] + v[9] + v[12] + v[13] + v[14]];

		

		if(chk(p[now].x, p[now].y + 2) && chk(p[now].x + 2, p[now].y))

		++r[v[3] + v[4] + v[5] + v[8] + v[9] + v[10] + v[13] + v[14] + v[15]];

		

		if(chk(p[now].x - 2, p[now].y + 1) && chk(p[now].x, p[now].y - 1))

		++r[v[6] + v[7] + v[8] + v[11] + v[12] + v[13] + v[16] + v[17] + v[18]];

		

		if(chk(p[now].x - 1, p[now].y + 1) && chk(p[now].x + 1, p[now].y - 1))

		++r[v[7] + v[8] + v[9] + v[12] + v[13] + v[14] + v[17] + v[18] + v[19]];

		

		if(chk(p[now].x, p[now].y + 1) && chk(p[now].x + 2, p[now].y - 1))

		++r[v[8] + v[9] + v[10] + v[13] + v[14] + v[15] + v[18] + v[19] + v[20]];

		

		if(chk(p[now].x - 2, p[now].y) && chk(p[now].x, p[now].y - 2))

		++r[v[11] + v[12] + v[13] + v[16] + v[17] + v[18] + v[21] + v[22] + v[23]];

		

		if(chk(p[now].x - 1, p[now].y) && chk(p[now].x + 1, p[now].y - 2))

		++r[v[12] + v[13] + v[14] + v[17] + v[18] + v[19] + v[22] + v[23] + v[24]];

		

		if(chk(p[now].x, p[now].y) && chk(p[now].x + 2, p[now].y - 2))

		++r[v[13] + v[14] + v[15] + v[18] + v[19] + v[20] + v[23] + v[24] + v[25]];

	}

	r[0] = (h - 2) * (w - 2);

	for(int i = 1; i <= 9; ++i) r[i] /= i, r[0] -= r[i];

	for(int i = 0; i <= 9; ++i) printf("%lld\n", r[i]);

	return 0;

}