Problem:
Score : 400 points

Problem Statement

We have a grid with H rows and W columns. At first, all cells were painted white.

Snuke painted N of these cells. The i-th ( 1 \leq i \leq N ) cell he painted is the cell at the a_i-th row and b_i-th column.

Compute the following:

For each integer j ( 0 \leq j \leq 9 ), how many subrectangles of size 3×3 of the grid contains exactly j black cells, after Snuke painted N cells?

Constraints

3 \leq H \leq 10^9

3 \leq W \leq 10^9

0 \leq N \leq min(10^5,H×W)

1 \leq a_i \leq H (1 \leq i \leq N)

1 \leq b_i \leq W (1 \leq i \leq N)

(a_i, b_i) \neq (a_j, b_j) (i \neq j)

Input

The input is given from Standard Input in the following format:

H W N
a_1 b_1
:
a_N b_N

Output

Print 10 lines.
The (j+1)-th ( 0 \leq j \leq 9 ) line should contain the number of the subrectangles of size 3×3 of the grid that contains exactly j black cells.

Sample Input 1

4 5 8
1 1
1 4
1 5
2 3
3 1
3 2
3 4
4 4

Sample Output 1

0
0
0
2
4
0
0
0
0
0

There are six subrectangles of size 3×3. Two of them contain three black cells each, and the remaining four contain four black cells each.

Sample Input 2

10 10 20
1 1
1 4
1 9
2 5
3 10
4 2
4 7
5 9
6 4
6 6
6 7
7 1
7 3
7 7
8 1
8 5
8 10
9 2
10 4
10 9

Sample Output 2

4
26
22
10
2
0
0
0
0
0

Sample Input 3

1000000000 1000000000 0

Sample Output 3

999999996000000004
0
0
0
0
0
0
0
0
0

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>	
#include<map>
#include<set>
#include<utility>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<sstream>
#include<iomanip>
#define loop(i,a,b) for(int i=a;i<b;i++) 
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mp make_pair
#define all(in) in.begin(),in.end()
#define shosu(x) fixed<<setprecision(x)
using namespace std;
//kaewasuretyuui
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef pair<int,pii> pip;
typedef vector<pip>vip;
const double PI=acos(-1);
const double EPS=1e-8;
const int inf=1e8;
//map<int,vp>tG;
//vector<map<int,vi> >tG;
map<int,map<int,bool> >tG;
/*int f(int a,int b){
	int r=-1,l=tG[a].size();
	while(l-r>1){
		int h=(r+l)/2;
		if(tG[a][h]<b)r=h;
		else l=h;
	}
	return l;
}*/
int main(){
	ll h,w,n;
	cin>>h>>w>>n;
	vector<ll>out(10);
	out[0]=(h-2)*(w-2);
	vp in(n);
	rep(i,n)cin>>in[i].first>>in[i].second;
//	tG=vector<map<int,vi> >(10010);
	rep(q,n){
		vvi G(5,vi(5));
		rep(i,5)rep(j,5){
			int x=in[q].first-2+i;
			int y=in[q].second-2+j;
			if(x<=0||y<=0||x>h||y>w)G[i][j]=-1;
		}
		loop(i,in[q].first-2,in[q].first+3)
			loop(j,in[q].second-2,in[q].second+3)if(tG[i][j]){
				G[i-in[q].first+2][j-in[q].second+2]=1;
//				if(x>=0&&x<5&&y>=0&&y<5)G[x][y]=1;
		}
//		rep(i,5){rep(j,5)cout<<" "<<G[i][j];cout<<endl;}
//		cout<<endl;
		rep(i,3)rep(j,3){
			int co=0;
			bool h=true;
			rep(k,3)rep(l,3)if(G[i+k][j+l]==-1)h=false;
			else if(G[i+k][j+l]==1)co++;
			if(!h)continue;
			out[co]--;
			out[co+1]++;
		}
//		tG[in[q].first/1000].pb(pii(in[q].second,in[q].first));
//		tG[in[q].first/100000][in[q].second].pb(in[q].first);
		tG[in[q].first][in[q].second]=1;
	}
	rep(i,10)cout<<out[i]<<endl;
}