import sys input = sys.stdin.readline from collections import defaultdict H,W,N,D=map(int,input().split()) P=[list(map(int,input().split())) for i in range(N)] DICT=dict() for i in range(N): DICT[P[i][0]*100002+P[i][1]]=i # UnionFind Group = [i for i in range(N)] # グループ分け Nodes = [1]*(N) # 各グループのノードの数 def find(x): while Group[x] != x: x=Group[x] return x def Union(x,y): if find(x) != find(y): if Nodes[find(x)] < Nodes[find(y)]: Nodes[find(y)] += Nodes[find(x)] Nodes[find(x)] = 0 Group[find(x)] = find(y) else: Nodes[find(x)] += Nodes[find(y)] Nodes[find(y)] = 0 Group[find(y)] = find(x) DS=[] for i in range(-D,D+1): for j in range(-D,D+1): if abs(i)+abs(j)<=D: DS.append((i,j)) for i in range(N): x,y=P[i] for dx,dy in DS: z,w=x+dx,y+dy if z*100002+w in DICT: k=DICT[z*100002+w] Union(i,k) ANS=0 for i in range(N): if find(i)==i: if Nodes[i]==1: pass else: ANS+=1 minus=0 BAD=defaultdict(set) for i in range(N): if Nodes[find(i)]>1: x,y=P[i] for dx,dy in DS: z,w=x+dx,y+dy BAD[z*100002+w].add(find(i)) minus=max(minus,len(BAD[z*100002+w])-1) plus=0 for i in range(N): if find(i)==i: if Nodes[i]==1: x,y=P[i] for dx,dy in DS: z,w=x+dx,y+dy if z*100002+w in BAD: pass else: plus=1 print(ANS-minus,ANS+plus)