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 Rust (1.15.1) (judge verdict: Runtime Error)

use std::collections::{HashSet, HashMap};

fn read1<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn readn<T: std::str::FromStr>(delimiter: &str) -> Vec<T> {
    let s = read1::<String>();
    s.split(delimiter).map(|e| e.parse().ok().unwrap()).collect::<Vec<T>>()
}

fn main() {
    let hwn = readn::<usize>(" ");
    let h = hwn[0];
    let w = hwn[1];
    let n = hwn[2];
    let ab = (0..n).map(|_| {
        let aabb = readn::<usize>(" ");
       (aabb[0]-1, aabb[1]-1)
    }).collect::<Vec<(usize, usize)>>();

    let mut y = HashSet::new();
    let mut x = HashSet::new();

    for i in 0..n {
        y.insert(ab[i].0);
        x.insert(ab[i].1);
    }

    let mut y = y.iter().map(|&i| i).collect::<Vec<usize>>();
    let mut x = x.iter().map(|&i| i).collect::<Vec<usize>>();
    y.sort();
    x.sort();

    let h2 = y.len();
    let w2 = x.len();
    let mut dy = HashMap::new();
    let mut dx = HashMap::new();
    for i in 0..h2 {
        dy.insert(y[i], i);
    }
    for i in 0..w2 {
        dx.insert(x[i], i);
    }
    let mut t = vec![vec![0; w2]; h2];

    for i in 0..n {
        t[dy[&(ab[i].0)]][dx[&(ab[i].1)]] = 1;
    }

    let mut ans = vec![0usize; 10];
    let mut cand = HashSet::new();

    for i in 0..n {
        let (a, b) = ab[i];
        for j in 0..3 {
            if a + j < 2 || a + j >= h + 2 { continue; }
            let py = a + j - 2;
            for k in 0..3 {
                if b + k < 2 || b + k >= w + 2 { continue; }
                let px = b + k - 2;
                if py + 2 < h && px + 2 < w {
                    cand.insert((py, px));
                }
            }
        }
    }

    for &(py, px) in cand.iter() {
        let mut sum = 0;
        for l in 0..3 {
            let qy = py + l;
            for m in 0..3 {
                let qx = px + m;
                match dy.get(&qy) {
                    Some(&ry) => {
                        match dx.get(&qx) {
                            Some(&rx) => { sum += t[ry][rx]; }
                            _ => { sum += 0; }
                        }
                    }
                    _ => { sum += 0; }
                }
            }
        }
        ans[sum] += 1;
    }
    let zero = (h - 2) * (w - 2) - ans.iter().sum::<usize>();
    let mut a = zero.to_string() + "\n";
    for i in 1..10 {
        a = a + &(ans[i].to_string()) + "\n";
    }
    print!("{}", a);
}