from collections import defaultdict class UnionFind(): def __init__(self,n): self.n=n self.parents=[-1]*n self.group_count=n def find(self,x): if self.parents[x]<0: return x else: self.parents[x]=self.find(self.parents[x]) return self.parents[x] def union(self,x,y): x=self.find(x) y=self.find(y) if x==y: return if self.parents[x]>self.parents[y]: x,y=y,x self.parents[x]+=self.parents[y] self.parents[y]=x self.group_count-=1 def size(self,x): return -self.parents[self.find(x)] def same(self,x,y): return self.find(x)==self.find(y) def members(self,x): root=self.find(x) return [i for i in range(self.n) if self.find(i)==root] def roots(self): return [i for i, x in enumerate(self.parents) if x< 0] def groups(self): group_members=defaultdict(list) for member in range(self.n): group_members[self.find(member)].append(member) return group_members from collections import deque H,W,N,D=map(int,input().split()) mat=[[-1]*W for i in range(H)] xy=[] for i in range(N): x,y=map(lambda x:int(x)-1,input().split()) mat[x][y]=i xy.append([x,y]) dxdy=[(1,0),(0,1),(-1,0),(0,-1)] uf=UnionFind(N) seen=[[-1]*W for i in range(H)] for i in range(N): x,y=xy[i] todo=deque() todo.append([0,x,y]) while todo: d0,x0,y0=todo.popleft() if mat[x0][y0]!=-1: uf.union(i,mat[x0][y0]) if d0==D: continue for dx,dy in dxdy: nx,ny=x0+dx,y0+dy if 0<=nx1: sz+=1 todo=deque() for j in g[i]: x,y=xy[j] todo.append([0,x,y]) while todo: d0,x0,y0=todo.popleft() if d0==D: continue for dx,dy in dxdy: nx,ny=x0+dx,y0+dy if 0<=nx