from collections import defaultdict class UnionFind(): def __init__(self, n): self.n = n self.root = [-1]*(n+1) self.rank = [0]*(n+1) def find(self, x): if(self.root[x] < 0): return x else: self.root[x] = self.find(self.root[x]) return self.root[x] def unite(self, x, y): x = self.find(x) y = self.find(y) if(x == y): return elif(self.rank[x] > self.rank[y]): self.root[x] += self.root[y] self.root[y] = x else: self.root[y] += self.root[x] self.root[x] = y if(self.rank[x] == self.rank[y]): self.rank[y] += 1 def same(self, x, y): return self.find(x) == self.find(y) def size(self, x): return -self.root[self.find(x)] def roots(self): return [i for i, x in enumerate(self.root) if x < 0] def group_size(self): return len(self.roots()) def group_members(self): group_members = defaultdict(list) for member in range(self.n): group_members[self.find(member)].append(member) return group_members H,W,N,D = map(int,input().split()) star = [[0 for j in range(W+1000)] for i in range(H+1000)] SS = [] for i in range(N): x,y = map(int,input().split()) star[x][y] = i+1 SS.append((x,y)) uf = UnionFind(N) for i in range(N): u = i + 1 x,y = SS[i] for dh in range(-5,6): for dw in range(-5,6): if abs(dh) + abs(dw) > D: continue v = star[x+dh][y+dw] if v == 0: continue uf.unite(u,v) R = [0 for i in range(N+1)] for u in range(1,N+1): r = uf.find(u) R[r] += 1 size = 0 for i in range(N+1): if R[i] > 1: size += 1 M = 0 m = N for h in range(1,H+1): for w in range(1,W+1): if star[h][w]: continue S = set() for dh in range(-5,6): for dw in range(-5,6): if abs(dh) + abs(dw) > D: continue if star[h+dh][w+dw] > 0: v = star[h+dh][w+dw] r = uf.find(v) S.add(r) S = list(S) s = 0 f = 0 for r in S: if R[r] == 1: f = 1 continue s += 1 if s > 0: s = s - 1 else: s = -f m = min(size - s,m) M = max(size - s,M) print(m,M)