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],P[i][1]]=i # UnionFind Group = [i for i in range(N+1)] # グループ分け Nodes = [1]*(N+1) # 各グループのノードの数 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) for i in range(N): x,y=P[i] for z in range(x-D,x+D+1): for w in range(y-D,y+D+1): if abs(x-z)+abs(y-w)<=D: if (z,w) in DICT: k=DICT[z,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 z in range(x-D,x+D+1): for w in range(y-D,y+D+1): if abs(x-z)+abs(y-w)<=D: BAD[(z,w)].add(find(i)) for z,w in BAD: minus=max(minus,len(BAD[z,w])-1) plus=0 for i in range(N): if find(i)==i: if Nodes[i]==1: x,y=P[i] for z in range(x-D,x+D+1): for w in range(y-D,y+D+1): if abs(x-z)+abs(y-w)<=D: if (z,w) in BAD: pass else: plus=1 print(ANS-minus,ANS+plus)