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



Sample input:
4 5 8
1 1
1 4
1 5
2 3
3 1
3 2
3 4
4 4


Sample output:
0
0
0
2
4
0
0
0
0
0

Submission status: Time Limit Exceeded

Solution code:
H,W,N=map(int,input().split())
ab=[list(map(int,input().split())) for i in range(N)]
ab.sort()

r_b=[0]
rows=[]
rows_app=rows.append
r_b_app=r_b.append
for i in range(1,N):
  if ab[i][0]!=ab[i-1][0]:
    r_b_app(i)
    rows_app(ab[i-1][0])

if N>0:
  rows.append(ab[N-1][0])
  r_b.append(N)

cols=[[ab[j][1] for j in range(r_b[i],r_b[i+1])] for i in range(len(r_b)-1)]

rN=len(cols)


ched_box0=[[[False]*3 for k in range(3)] for j in range((len(cols[0]) if 0<rN else 0))]
ched_box1=[[[False]*3 for k in range(3)] for j in range((len(cols[1]) if 1<rN else 0))]
ched_box2=[[[False]*3 for k in range(3)] for j in range((len(cols[2]) if 2<rN else 0))]

dic_cn0=dict(zip(cols[0],list(range(len(cols[0]))))) if 0<rN else {}
dic_cn1=dict(zip(cols[1],list(range(len(cols[1]))))) if 1<rN else {}
dic_cn2=dict(zip(cols[2],list(range(len(cols[2]))))) if 2<rN else {}

area_n=[0]*9

count=[[1]*3 for i in range(3)]
find_cn=[0]*12

for rn in range(rN):
  cN=len(cols[rn])
  row=rows[rn]

  if rn!=0:
    ched_box0=ched_box1
    dic_cn0=dic_cn1
    ched_box1=ched_box2
    dic_cn1=dic_cn2
    if rn<rN-2:
      ched_box2=[[[False]*3 for k in range(3)] for j in range(len(cols[rn+2]))]
      dic_cn2=dict(zip(cols[rn+2],list(range(len(cols[rn+2])))))

  if (rows[rn+1]==row+1 if rn<rN-1 else False):
    row1=row+1
    if (rows[rn+2]==row+2 if rn<rN-2 else False):
      row2=row+2
    else:
      row2=None
  elif (rows[rn+1]==row+2 if rn<rN-1 else False):
    row1=row+2
    row2=None
  else:
    row1=None
    row2=None
  
  for cn in range(cN):
    col=cols[rn][cn]
    ched_box=ched_box0[cn]
 
    
    for box_row in range(3):
      for box_col in range(3):
        if col-2+box_col<1 or col+box_col>W or row-2+box_row<1 or row+box_row>H:
          ched_box[box_row][box_col]=True
          
    ched_box_col_min=[-1,-1,-1]
    ched_box_col_max=[3,3,3]
    for box_row in range(3):
      for box_col in range(3):
        if not ched_box[box_row][box_col]:
          if ched_box_col_min[box_row]<0:
            ched_box_col_min[box_row]=box_col
        else:
          if ched_box_col_min[box_row]>=0:
            ched_box_col_max[box_row]=box_col-1
            break
      else:
        ched_box_col_max[box_row]=2
        if ched_box_col_min[box_row]<0:
          ched_box_col_min[box_row]=3

          
          
    find_rowcol=[]

    find_rowcol_app=find_rowcol.append
    find_cn_n=0

    for ch_row in range(row,min(row+3,H+1)):
      if ch_row==row:
        for ch_col in range(col+1,min(col+3,W+1)):
          if ch_col in dic_cn0:
            find_rowcol_app([row,ch_col])
            find_cn[find_cn_n]=dic_cn0[ch_col]
            find_cn_n+=1
      elif ch_row==row1:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn1:
            find_rowcol_app([row1,ch_col])
            find_cn[find_cn_n]=dic_cn1[ch_col]
            find_cn_n+=1
      elif ch_row==row2:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn2:
            find_rowcol_app([row2,ch_col])
            find_cn[find_cn_n]=dic_cn2[ch_col]
            find_cn_n+=1
            
    del dic_cn0[col]
        
    for i,[find_row,find_col] in enumerate(find_rowcol):
      
      if find_row==row:
        ch_rn=0
        ch_cn=find_cn[i]
      elif find_row==row1:
        ch_rn=1
        ch_cn=find_cn[i]
      elif find_row==row2:
        ch_rn=2
        ch_cn=find_cn[i]
      
      for box_row in range(find_row-row,3):
        for box_col in range(max(find_col-col,ched_box_col_min[box_row]),min(ched_box_col_max[box_row]+1,3+find_col-col)):
          count[box_row][box_col]+=1
          if ch_rn==0:
            ched_box0[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
          elif ch_rn==1:
            ched_box1[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
          else:
            ched_box2[ch_cn][box_row-find_row+row][box_col-find_col+col]=True

    for box_row in range(3):
      for box_col in range(ched_box_col_min[box_row],ched_box_col_max[box_row]+1):
        if not ched_box[box_row][box_col]:
          area_n[count[box_row][box_col]-1]+=1
          count[box_row][box_col]=1
          



print((W-2)*(H-2)-sum(area_n))
for i in range(9):
  print(area_n[i])

Submission status: Time Limit Exceeded

Solution code:
H,W,N=map(int,input().split())
ab=[list(map(int,input().split())) for i in range(N)]
ab.sort()

r_b=[0]
rows=[]
rows_app=rows.append
r_b_app=r_b.append
for i in range(1,N):
  if ab[i][0]!=ab[i-1][0]:
    r_b_app(i)
    rows_app(ab[i-1][0])

if N>0:
  rows.append(ab[N-1][0])
  r_b.append(N)

cols=[[ab[j][1] for j in range(r_b[i],r_b[i+1])] for i in range(len(r_b)-1)]

rN=len(cols)


ched_box0=[[[False]*3 for k in range(3)] for j in range((len(cols[0]) if 0<rN else 0))]
ched_box1=[[[False]*3 for k in range(3)] for j in range((len(cols[1]) if 1<rN else 0))]
ched_box2=[[[False]*3 for k in range(3)] for j in range((len(cols[2]) if 2<rN else 0))]

dic_cn0=dict(zip(cols[0],list(range(len(cols[0]))))) if 0<rN else {}
dic_cn1=dict(zip(cols[1],list(range(len(cols[1]))))) if 1<rN else {}
dic_cn2=dict(zip(cols[2],list(range(len(cols[2]))))) if 2<rN else {}

area_n=[0]*9

count=[1]*9
find_cn=[0]*12

for rn in range(rN):
  cN=len(cols[rn])
  row=rows[rn]

  if rn!=0:
    ched_box0=ched_box1
    dic_cn0=dic_cn1
    ched_box1=ched_box2
    dic_cn1=dic_cn2
    if rn<rN-2:
      ched_box2=[[[False]*3 for k in range(3)] for j in range(len(cols[rn+2]))]
      dic_cn2=dict(zip(cols[rn+2],list(range(len(cols[rn+2])))))

  if (rows[rn+1]==row+1 if rn<rN-1 else False):
    row1=row+1
    if (rows[rn+2]==row+2 if rn<rN-2 else False):
      row2=row+2
    else:
      row2=None
  elif (rows[rn+1]==row+2 if rn<rN-1 else False):
    row1=row+2
    row2=None
  else:
    row1=None
    row2=None
  
  for cn in range(cN):
    col=cols[rn][cn]
    ched_box=ched_box0[cn]
       
    for box_row in range(3):
      for box_col in range(3):
        if col-2+box_col<1 or col+box_col>W or row-2+box_row<1 or row+box_row>H:
          ched_box[box_row][box_col]=True
    find_rowcol=[]

    find_rowcol_app=find_rowcol.append
    find_cn_n=0

    for ch_row in range(row,min(row+3,H+1)):
      if ch_row==row:
        for ch_col in range(col+1,min(col+3,W+1)):
          if ch_col in dic_cn0:
            find_rowcol_app([row,ch_col])
            find_cn[find_cn_n]=dic_cn0[ch_col]
            find_cn_n+=1
      elif ch_row==row1:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn1:
            find_rowcol_app([row1,ch_col])
            find_cn[find_cn_n]=dic_cn1[ch_col]
            find_cn_n+=1
      elif ch_row==row2:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn2:
            find_rowcol_app([row2,ch_col])
            find_cn[find_cn_n]=dic_cn2[ch_col]
            find_cn_n+=1
            
    del dic_cn0[col]
        
    for i,[find_row,find_col] in enumerate(find_rowcol):
      
      if find_row==row:
        ch_rn=0
        ch_cn=find_cn[i]
      elif find_row==row1:
        ch_rn=1
        ch_cn=find_cn[i]
      elif find_row==row2:
        ch_rn=2
        ch_cn=find_cn[i]
      
      for box_row in range(find_row-row,3):
        for box_col in range(max(find_col-col,0),min(3,3+find_col-col)):
          if not ched_box[box_row][box_col]:
            count[3*box_row+box_col]+=1
            if ch_rn==0:
              ched_box0[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            elif ch_rn==1:
              ched_box1[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            else:
              ched_box2[ch_cn][box_row-find_row+row][box_col-find_col+col]=True

    for box_row in range(3):
      for box_col in range(3):
        if not ched_box[box_row][box_col]:
          area_n[count[3*box_row+box_col]-1]+=1
          count[3*box_row+box_col]=1
          



print((W-2)*(H-2)-sum(area_n))
for i in range(9):
  print(area_n[i])

Submission status: Time Limit Exceeded

Solution code:
H,W,N=map(int,input().split())
ab=[list(map(int,input().split())) for i in range(N)]
ab.sort()

r_b=[0]
rows=[]
rows_app=rows.append
r_b_app=r_b.append
for i in range(1,N):
  if ab[i][0]!=ab[i-1][0]:
    r_b_app(i)
    rows_app(ab[i-1][0])

if N>0:
  rows.append(ab[N-1][0])
  r_b.append(N)

cols=[[ab[j][1] for j in range(r_b[i],r_b[i+1])] for i in range(len(r_b)-1)]

rN=len(cols)


ched_box0=[[[False]*3 for k in range(3)] for j in range((len(cols[0]) if 0<rN else 0))]
ched_box1=[[[False]*3 for k in range(3)] for j in range((len(cols[1]) if 1<rN else 0))]
ched_box2=[[[False]*3 for k in range(3)] for j in range((len(cols[2]) if 2<rN else 0))]

dic_cn0=dict(zip(cols[0],list(range(len(cols[0]))))) if 0<rN else {}
dic_cn1=dict(zip(cols[1],list(range(len(cols[1]))))) if 1<rN else {}
dic_cn2=dict(zip(cols[2],list(range(len(cols[2]))))) if 2<rN else {}

area_n=[0]*9

count=[[1]*3 for i in range(3)]
find_cn=[0]*12

for rn in range(rN):
  cN=len(cols[rn])
  row=rows[rn]

  if rn!=0:
    ched_box0=ched_box1
    dic_cn0=dic_cn1
    ched_box1=ched_box2
    dic_cn1=dic_cn2
    if rn<rN-2:
      ched_box2=[[[False]*3 for k in range(3)] for j in range(len(cols[rn+2]))]
      dic_cn2=dict(zip(cols[rn+2],list(range(len(cols[rn+2])))))

  if (rows[rn+1]==row+1 if rn<rN-1 else False):
    row1=row+1
    if (rows[rn+2]==row+2 if rn<rN-2 else False):
      row2=row+2
    else:
      row2=None
  elif (rows[rn+1]==row+2 if rn<rN-1 else False):
    row1=row+2
    row2=None
  else:
    row1=None
    row2=None
  
  for cn in range(cN):
    col=cols[rn][cn]
    ched_box=ched_box0[cn]
       
    for box_row in range(3):
      for box_col in range(3):
        if col-2+box_col<1 or col+box_col>W or row-2+box_row<1 or row+box_row>H:
          ched_box[box_row][box_col]=True
    find_rowcol=[]

    find_rowcol_app=find_rowcol.append
    find_cn_n=0

    for ch_row in range(row,min(row+3,H+1)):
      if ch_row==row:
        for ch_col in range(col+1,min(col+3,W+1)):
          if ch_col in dic_cn0:
            find_rowcol_app([row,ch_col])
            find_cn[find_cn_n]=dic_cn0[ch_col]
            find_cn_n+=1
      elif ch_row==row1:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn1:
            find_rowcol_app([row1,ch_col])
            find_cn[find_cn_n]=dic_cn1[ch_col]
            find_cn_n+=1
      elif ch_row==row2:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn2:
            find_rowcol_app([row2,ch_col])
            find_cn[find_cn_n]=dic_cn2[ch_col]
            find_cn_n+=1
            
    del dic_cn0[col]
        
    for i,[find_row,find_col] in enumerate(find_rowcol):
      
      if find_row==row:
        ch_rn=0
        ch_cn=find_cn[i]
      elif find_row==row1:
        ch_rn=1
        ch_cn=find_cn[i]
      elif find_row==row2:
        ch_rn=2
        ch_cn=find_cn[i]
      
      for box_row in range(find_row-row,3):
        for box_col in range(max(find_col-col,0),min(3,3+find_col-col)):
          if not ched_box[box_row][box_col]:
            count[box_row][box_col]+=1
            if ch_rn==0:
              ched_box0[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            elif ch_rn==1:
              ched_box1[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            else:
              ched_box2[ch_cn][box_row-find_row+row][box_col-find_col+col]=True

    for box_row in range(3):
      for box_col in range(3):
        if not ched_box[box_row][box_col]:
          area_n[count[box_row][box_col]-1]+=1
          count[box_row][box_col]=1
          



print((W-2)*(H-2)-sum(area_n))
for i in range(9):
  print(area_n[i])

Submission status: Time Limit Exceeded

Solution code:
H,W,N=map(int,input().split())
ab=[list(map(int,input().split())) for i in range(N)]
ab.sort()

r_b=[0]
rows=[]
rows_app=rows.append
r_b_app=r_b.append
for i in range(1,N):
  if ab[i][0]!=ab[i-1][0]:
    r_b_app(i)
    rows_app(ab[i-1][0])

if N>0:
  rows.append(ab[N-1][0])
  r_b.append(N)

cols=[[ab[j][1] for j in range(r_b[i],r_b[i+1])] for i in range(len(r_b)-1)]

rN=len(cols)


ched_box0=[[[False]*3 for k in range(3)] for j in range((len(cols[0]) if 0<rN else 0))]
ched_box1=[[[False]*3 for k in range(3)] for j in range((len(cols[1]) if 1<rN else 0))]
ched_box2=[[[False]*3 for k in range(3)] for j in range((len(cols[2]) if 2<rN else 0))]

dic_cn0=dict(zip(cols[0],list(range(len(cols[0]))))) if 0<rN else {}
dic_cn1=dict(zip(cols[1],list(range(len(cols[1]))))) if 1<rN else {}
dic_cn2=dict(zip(cols[2],list(range(len(cols[2]))))) if 2<rN else {}

area_n=[0]*9

count=[[1]*3 for i in range(3)]
find_cn=[0]*12

for rn in range(rN):
  cN=len(cols[rn])
  row=rows[rn]

  if rn!=0:
    ched_box0=ched_box1
    dic_cn0=dic_cn1
    ched_box1=ched_box2
    dic_cn1=dic_cn2
    if rn<rN-2:
      ched_box2=[[[False]*3 for k in range(3)] for j in range(len(cols[rn+2]))]
      dic_cn2=dict(zip(cols[rn+2],list(range(len(cols[rn+2])))))

  if (rows[rn+1]==row+1 if rn<rN-1 else False):
    row1=row+1
    if (rows[rn+2]==row+2 if rn<rN-2 else False):
      row2=row+2
    else:
      row2=None
  elif (rows[rn+1]==row+2 if rn<rN-1 else False):
    row1=row+2
    row2=None
  else:
    row1=None
    row2=None
  
  for cn in range(cN):
    col=cols[rn][cn]
    ched_box=ched_box0[cn]
       
    for box_row in range(3):
      for box_col in range(3):
        if col-2+box_col<1 or col+box_col>W or row-2+box_row<1 or row+box_row>H:
          ched_box[box_row][box_col]=True
    find_rowcol=[]

    find_rowcol_app=find_rowcol.append
    find_cn_n=0

    for ch_row in range(row,min(row+3,H+1)):
      if ch_row==row:
        for ch_col in range(col+1,min(col+3,W+1)):
          if ch_col in dic_cn0:
            find_rowcol_app([row,ch_col])
            find_cn[find_cn_n]=dic_cn0[ch_col]
            find_cn_n+=1
      elif ch_row==row1:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn1:
            find_rowcol_app([row1,ch_col])
            find_cn[find_cn_n]=dic_cn1[ch_col]
            find_cn_n+=1
      elif ch_row==row2:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn2:
            find_rowcol_app([row2,ch_col])
            find_cn[find_cn_n]=dic_cn2[ch_col]
            find_cn_n+=1
            
    #del dic_cn0[col]
        
    for i,[find_row,find_col] in enumerate(find_rowcol):
      
      if find_row==row:
        ch_rn=0
        ch_cn=find_cn[i]
      elif find_row==row1:
        ch_rn=1
        ch_cn=find_cn[i]
      elif find_row==row2:
        ch_rn=2
        ch_cn=find_cn[i]
      
      for box_row in range(find_row-row,3):
        for box_col in range(max(find_col-col,0),min(3,3+find_col-col)):
          if not ched_box[box_row][box_col]:
            count[box_row][box_col]+=1
            if ch_rn==0:
              ched_box0[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            elif ch_rn==1:
              ched_box1[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            else:
              ched_box2[ch_cn][box_row-find_row+row][box_col-find_col+col]=True

    for box_row in range(3):
      for box_col in range(3):
        if not ched_box[box_row][box_col]:
          area_n[count[box_row][box_col]-1]+=1
          count[box_row][box_col]=1
          



print((W-2)*(H-2)-sum(area_n))
for i in range(9):
  print(area_n[i])

Submission status: Time Limit Exceeded

Solution code:
H,W,N=map(int,input().split())
ab=[list(map(int,input().split())) for i in range(N)]
ab.sort()

r_b=[0]
rows=[]
rows_app=rows.append
r_b_app=r_b.append
for i in range(1,N):
  if ab[i][0]!=ab[i-1][0]:
    r_b_app(i)
    rows_app(ab[i-1][0])

if N>0:
  rows.append(ab[N-1][0])
  r_b.append(N)

cols=[[ab[j][1] for j in range(r_b[i],r_b[i+1])] for i in range(len(r_b)-1)]

rN=len(cols)


ched_box0=[[[False]*3 for k in range(3)] for j in range((len(cols[0]) if 0<rN else 0))]
ched_box1=[[[False]*3 for k in range(3)] for j in range((len(cols[1]) if 1<rN else 0))]
ched_box2=[[[False]*3 for k in range(3)] for j in range((len(cols[2]) if 2<rN else 0))]

dic_cn0=dict(zip(cols[0],list(range(len(cols[0]))))) if 0<rN else {}
dic_cn1=dict(zip(cols[1],list(range(len(cols[1]))))) if 1<rN else {}
dic_cn2=dict(zip(cols[2],list(range(len(cols[2]))))) if 2<rN else {}

area_n=[0]*9

count=[[1]*3 for i in range(3)]
find_cn=[0]*12

for rn in range(rN):
  cN=len(cols[rn])
  row=rows[rn]

  if rn!=0:
    ched_box0=ched_box1
    dic_cn0=dic_cn1
    ched_box1=ched_box2
    dic_cn1=dic_cn2
    if rn<rN-2:
      ched_box2=[[[False]*3 for k in range(3)] for j in range(len(cols[rn+2]))]
      dic_cn2=dict(zip(cols[rn+2],list(range(len(cols[rn+2])))))

  if (rows[rn+1]==row+1 if rn<rN-1 else False):
    row1=row+1
    if (rows[rn+2]==row+2 if rn<rN-2 else False):
      row2=row+2
    else:
      row2=None
  elif (rows[rn+1]==row+2 if rn<rN-1 else False):
    row1=row+2
    row2=None
  else:
    row1=None
    row2=None
  
  for cn in range(cN):
    col=cols[rn][cn]
    ched_box=ched_box0[cn]
       
    for box_row in range(3):
      for box_col in range(3):
        if col-2+box_col<1 or col+box_col>W or row-2+box_row<1 or row+box_row>H:
          ched_box[box_row][box_col]=True
    find_rowcol=[]

    find_rowcol_app=find_rowcol.append
    find_cn_n=0

    for ch_row in range(row,min(row+3,H+1)):
      if ch_row==row:
        for ch_col in range(col+1,min(col+3,W+1)):
          if ch_col in dic_cn0:
            find_rowcol_app([row,ch_col])
            find_cn[find_cn_n]=dic_cn0[ch_col]
            find_cn_n+=1
      elif ch_row==row1:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn1:
            find_rowcol_app([row1,ch_col])
            find_cn[find_cn_n]=dic_cn1[ch_col]
            find_cn_n+=1
      elif ch_row==row2:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn2:
            find_rowcol_app([row2,ch_col])
            find_cn[find_cn_n]=dic_cn2[ch_col]
            find_cn_n+=1
            

        
    for i,[find_row,find_col] in enumerate(find_rowcol):
      
      if find_row==row:
        ch_rn=0
        ch_cn=find_cn[i]
      elif find_row==row1:
        ch_rn=1
        ch_cn=find_cn[i]
      elif find_row==row2:
        ch_rn=2
        ch_cn=find_cn[i]
      
      for box_row in range(find_row-row,3):
        for box_col in range(max(find_col-col,0),min(3,3+find_col-col)):
          if not ched_box[box_row][box_col]:
            count[box_row][box_col]+=1
            if ch_rn==0:
              ched_box0[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            elif ch_rn==1:
              ched_box1[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            else:
              ched_box2[ch_cn][box_row-find_row+row][box_col-find_col+col]=True

    for box_row in range(3):
      for box_col in range(3):
        if not ched_box[box_row][box_col]:
          area_n[count[box_row][box_col]-1]+=1
          count[box_row][box_col]=1
      



print((W-2)*(H-2)-sum(area_n))
for i in range(9):
  print(area_n[i])

Submission status: Time Limit Exceeded

Solution code:
H,W,N=map(int,input().split())
ab=[list(map(int,input().split())) for i in range(N)]
ab.sort()

r_b=[0]
rows=[]
rows_app=rows.append
r_b_app=r_b.append
for i in range(1,N):
  if ab[i][0]!=ab[i-1][0]:
    r_b_app(i)
    rows_app(ab[i-1][0])

if N>0:
  rows.append(ab[N-1][0])
  r_b.append(N)

cols=[[ab[j][1] for j in range(r_b[i],r_b[i+1])] for i in range(len(r_b)-1)]

rN=len(cols)


ched_box0=[[[False]*3 for k in range(3)] for j in range((len(cols[0]) if 0<rN else 0))]
ched_box1=[[[False]*3 for k in range(3)] for j in range((len(cols[1]) if 1<rN else 0))]
ched_box2=[[[False]*3 for k in range(3)] for j in range((len(cols[2]) if 2<rN else 0))]

dic_cn0=dict(zip(cols[0],list(range(len(cols[0]))))) if 0<rN else {}
dic_cn1=dict(zip(cols[1],list(range(len(cols[1]))))) if 1<rN else {}
dic_cn2=dict(zip(cols[2],list(range(len(cols[2]))))) if 2<rN else {}

area_n=[0]*9

count=[[1]*3 for i in range(3)]
find_cn=[0]*12

for rn in range(rN):
  cN=len(cols[rn])
  row=rows[rn]

  if rn!=0:
    ched_box0=ched_box1
    dic_cn0=dic_cn1
    ched_box1=ched_box2
    dic_cn1=dic_cn2
    if rn<rN-2:
      ched_box2=[[[False]*3 for k in range(3)] for j in range(len(cols[rn+2]))]
      dic_cn2=dict(zip(cols[rn+2],list(range(len(cols[rn+2])))))

  if (rows[rn+1]==row+1 if rn<rN-1 else False):
    row1=row+1
    if (rows[rn+2]==row+2 if rn<rN-2 else False):
      row2=row+2
    else:
      row2=None
  elif (rows[rn+1]==row+2 if rn<rN-1 else False):
    row1=row+2
    row2=None
  else:
    row1=None
    row2=None
  
  for cn in range(cN):
    col=cols[rn][cn]
       
    for box_row in range(3):
      for box_col in range(3):
        if col-2+box_col<1 or col+box_col>W or row-2+box_row<1 or row+box_row>H:
          ched_box0[cn][box_row][box_col]=True
    find_rowcol=[]

    find_rowcol_app=find_rowcol.append
    find_cn_n=0

    for ch_row in range(row,min(row+3,H+1)):
      if ch_row==row:
        for ch_col in range(col+1,min(col+3,W+1)):
          if ch_col in dic_cn0:
            find_rowcol_app([row,ch_col])
            find_cn[find_cn_n]=dic_cn0[ch_col]
            find_cn_n+=1
      elif ch_row==row1:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn1:
            find_rowcol_app([row1,ch_col])
            find_cn[find_cn_n]=dic_cn1[ch_col]
            find_cn_n+=1
      elif ch_row==row2:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn2:
            find_rowcol_app([row2,ch_col])
            find_cn[find_cn_n]=dic_cn2[ch_col]
            find_cn_n+=1
            

        
    for i,[find_row,find_col] in enumerate(find_rowcol):
      
      if find_row==row:
        ch_rn=0
        ch_cn=find_cn[i]
      elif find_row==row1:
        ch_rn=1
        ch_cn=find_cn[i]
      elif find_row==row2:
        ch_rn=2
        ch_cn=find_cn[i]
      
      for box_row in range(find_row-row,3):
        for box_col in range(max(find_col-col,0),min(3,3+find_col-col)):
          if not ched_box0[cn][box_row][box_col]:
            count[box_row][box_col]+=1
            if ch_rn==0:
              ched_box0[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            elif ch_rn==1:
              ched_box1[ch_cn][box_row-find_row+row][box_col-find_col+col]=True
            else:
              ched_box2[ch_cn][box_row-find_row+row][box_col-find_col+col]=True

    for box_row in range(3):
      for box_col in range(3):
        if not ched_box0[cn][box_row][box_col]:
          area_n[count[box_row][box_col]-1]+=1
          count[box_row][box_col]=1
      



print((W-2)*(H-2)-sum(area_n))
for i in range(9):
  print(area_n[i])

Submission status: Time Limit Exceeded

Solution code:
import bisect
import heapq
H,W,N = map(int,input().split())
P = list(list(map(int,input().split()))for i in range(N))
P.sort()

def index(a,x):
    i = bisect.bisect_left(a,x)
    if i != len(a) and a[i] == x:
        return 0
    return -1

def around(a,b):
    out = []
    for i in [-1,0,1]:
        if not 1 < a+i < H:
            continue
        for j in [-1,0,1]:
            if not 1 < b+j < W:
                continue
            out.append([a+i,b+j])
    return out



def search(a,b):
    hoge = 0
    for i in [-1,0,1]:
        for j in [-1,0,1]:
            x,y = a+i,b+j
            if index(P,[x,y]) != -1:
                hoge += 1
    return hoge

A = []
for a,b in P:
    for x,y in around(a,b):
        heapq.heappush(A,[search(x,y),x,y])
a,b = 0,0
ans = [0]*10

while A:
    a = heapq.heappop(A)
    if a != b:
        ans[a[0]] += 1
    b = a[:]

ans[0] = (H-2)*(W-2)-sum(ans[1:])

for i in ans:
    print(i)

Submission status: Time Limit Exceeded

Solution code:
H,W,N=map(int,input().split())
ab=[list(map(int,input().split())) for i in range(N)]
ab.sort()

r_b=[0]
rows=[]
rows_app=rows.append
r_b_app=r_b.append
for i in range(1,N):
  if ab[i][0]!=ab[i-1][0]:
    r_b_app(i)
    rows_app(ab[i-1][0])

if N>0:
  rows.append(ab[N-1][0])
  r_b.append(N)

cols=[[ab[j][1] for j in range(r_b[i],r_b[i+1])] for i in range(len(r_b)-1)]

rN=len(cols)


ched_box=[[[[False]*3 for k in range(3)] for j in range((len(cols[i]) if i<rN else 0))] for i in range(3)]
dic_cn0=dict(zip(cols[0],list(range(len(cols[0]))))) if 0<rN else {}
dic_cn1=dict(zip(cols[1],list(range(len(cols[1]))))) if 1<rN else {}
dic_cn2=dict(zip(cols[2],list(range(len(cols[2]))))) if 2<rN else {}

area_n=[0]*9

count=[[1]*3 for i in range(3)]
find_cn=[0]*12

for rn in range(rN):
  cN=len(cols[rn])
  row=rows[rn]

  if rn!=0:
    ched_box[0]=ched_box[1]
    dic_cn0=dic_cn1
    ched_box[1]=ched_box[2]
    dic_cn1=dic_cn2
    if rn<rN-2:
      ched_box[2]=[[[False]*3 for k in range(3)] for j in range(len(cols[rn+2]))]
      dic_cn2=dict(zip(cols[rn+2],list(range(len(cols[rn+2])))))

  if (rows[rn+1]==row+1 if rn<rN-1 else False):
    row1=row+1
    if (rows[rn+2]==row+2 if rn<rN-2 else False):
      row2=row+2
    else:
      row2=None
  elif (rows[rn+1]==row+2 if rn<rN-1 else False):
    row1=row+2
    row2=None
  else:
    row1=None
    row2=None
  
  for cn in range(cN):
    col=cols[rn][cn]
       
    for box_row in range(3):
      for box_col in range(3):
        if col-2+box_col<1 or col+box_col>W or row-2+box_row<1 or row+box_row>H:
          ched_box[0][cn][box_row][box_col]=True
    find_rowcol=[]

    find_rowcol_app=find_rowcol.append
    find_cn_n=0

    for ch_row in range(row,min(row+3,H+1)):
      if ch_row==row:
        for ch_col in range(col+1,min(col+3,W+1)):
          if ch_col in dic_cn0:
            find_rowcol_app([row,ch_col])
            find_cn[find_cn_n]=dic_cn0[ch_col]
            find_cn_n+=1
      elif ch_row==row1:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn1:
            find_rowcol_app([row1,ch_col])
            find_cn[find_cn_n]=dic_cn1[ch_col]
            find_cn_n+=1
      elif ch_row==row2:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn2:
            find_rowcol_app([row2,ch_col])
            find_cn[find_cn_n]=dic_cn2[ch_col]
            find_cn_n+=1
            

    
    ch_box_row_col=[]

        
    for i,[find_row,find_col] in enumerate(find_rowcol):
      
      if find_row==row:
        ch_rn=0
        ch_cn=find_cn[i]
      elif find_row==row1:
        ch_rn=1
        ch_cn=find_cn[i]
      elif find_row==row2:
        ch_rn=2
        ch_cn=find_cn[i]
      
      for box_row in range(find_row-row,3):
        for box_col in range(max(find_col-col,0),min(3,3+find_col-col)):
          if not ched_box[0][cn][box_row][box_col]:
            count[box_row][box_col]+=1
            ched_box[ch_rn][ch_cn][box_row-find_row+row][box_col-find_col+col]=True
    for box_row in range(3):
      for box_col in range(3):
        if not ched_box[0][cn][box_row][box_col]:
          area_n[count[box_row][box_col]-1]+=1
          count[box_row][box_col]=1
      



print((W-2)*(H-2)-sum(area_n))
for i in range(9):
  print(area_n[i])

Submission status: Time Limit Exceeded

Solution code:
H,W,N=map(int,input().split())
ab=[list(map(int,input().split())) for i in range(N)]
ab.sort()

r_b=[0]
rows=[]
rows_app=rows.append
r_b_app=r_b.append
for i in range(1,N):
  if ab[i][0]!=ab[i-1][0]:
    r_b_app(i)
    rows_app(ab[i-1][0])

if N>0:
  rows.append(ab[N-1][0])
  r_b.append(N)

cols=[[ab[j][1] for j in range(r_b[i],r_b[i+1])] for i in range(len(r_b)-1)]

rN=len(cols)


ched_box=[[[[False]*3 for k in range(3)] for j in range((len(cols[i]) if i<rN else 0))] for i in range(3)]
dic_cn=[dict(zip(cols[i],list(range(len(cols[i]))))) if i<rN else {} for i in range(3)]
area_n=[0]*9

count=[[1]*3 for i in range(3)]
find_cn=[0]*12

for rn in range(rN):
  cN=len(cols[rn])
  row=rows[rn]

  if rn!=0:
    ched_box[0]=ched_box[1]
    dic_cn[0]=dic_cn[1]
    ched_box[1]=ched_box[2]
    dic_cn[1]=dic_cn[2]
    if rn<rN-2:
      ched_box[2]=[[[False]*3 for k in range(3)] for j in range(len(cols[rn+2]))]
      dic_cn[2]=dict(zip(cols[rn+2],list(range(len(cols[rn+2])))))

  if (rows[rn+1]==row+1 if rn<rN-1 else False):
    row1=row+1
    if (rows[rn+2]==row+2 if rn<rN-2 else False):
      row2=row+2
    else:
      row2=None
  elif (rows[rn+1]==row+2 if rn<rN-1 else False):
    row1=row+2
    row2=None
  else:
    row1=None
    row2=None
  
  for cn in range(cN):
    col=cols[rn][cn]
       
    for box_row in range(3):
      for box_col in range(3):
        if col-2+box_col<1 or col+box_col>W or row-2+box_row<1 or row+box_row>H:
          ched_box[0][cn][box_row][box_col]=True
    find_rowcol=[]

    find_rowcol_app=find_rowcol.append
    find_cn_n=0

    for ch_row in range(row,min(row+3,H+1)):
      if ch_row==row:
        for ch_col in range(col+1,min(col+3,W+1)):
          if ch_col in dic_cn[0]:
            find_rowcol_app([row,ch_col])
            find_cn[find_cn_n]=dic_cn[0][ch_col]
            find_cn_n+=1
      elif ch_row==row1:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn[1]:
            find_rowcol_app([row1,ch_col])
            find_cn[find_cn_n]=dic_cn[1][ch_col]
            find_cn_n+=1
      elif ch_row==row2:
        for ch_col in range(max(col-2,1),min(col+3,W+1)):
          if ch_col in dic_cn[2]:
            find_rowcol_app([row2,ch_col])
            find_cn[find_cn_n]=dic_cn[2][ch_col]
            find_cn_n+=1
            

    
    ch_box_row_col=[]

        
    for i,[find_row,find_col] in enumerate(find_rowcol):
      
      if find_row==row:
        ch_rn=0
        ch_cn=find_cn[i]
      elif find_row==row1:
        ch_rn=1
        ch_cn=find_cn[i]
      elif find_row==row2:
        ch_rn=2
        ch_cn=find_cn[i]
      
      for box_row in range(find_row-row,3):
        for box_col in range(max(find_col-col,0),min(3,3+find_col-col)):
          if not ched_box[0][cn][box_row][box_col]:
            count[box_row][box_col]+=1
            ched_box[ch_rn][ch_cn][box_row-find_row+row][box_col-find_col+col]=True
    for box_row in range(3):
      for box_col in range(3):
        if not ched_box[0][cn][box_row][box_col]:
          area_n[count[box_row][box_col]-1]+=1
          count[box_row][box_col]=1
      



print((W-2)*(H-2)-sum(area_n))
for i in range(9):
  print(area_n[i])