def main(): from sys import stdin, setrecursionlimit input = stdin.readline readline = stdin.readline H,W,N,D=map(int, input().split()) A=[[-1]*W for _ in range(H)] C=[] for i in range(N): h,w=map(int, input().split()) h-=1;w-=1 C.append((h,w)) A[h][w]=i B=[] for i in range(-D,D+1): for j in range(-D,D+1): if abs(i)+abs(j)<=D: B.append((i,j)) class RollbackUnionFind(): def __init__(self,size): self.uf=[[-1,0,1,True] for i in range(size)] self.ope=[] def unite(self,fir,sec): one=self.root(fir) two=self.root(sec) self.ope.append((0,(one,self.uf[one][:]),(two,self.uf[two][:]))) if one!=two: if self.uf[one][1]>self.uf[two][1]: one,two=two,one self.uf[one][0]=two self.uf[two][2]+=self.uf[one][2] self.uf[two][3]=self.uf[one][3]&self.uf[two][3] if self.uf[one][1]==self.uf[two][1]: self.uf[two][1]+=1 else: self.uf[one][3]=False def same(self,fir,sec): return self.root(fir)==self.root(sec) def root(self,node): pos=node while self.uf[pos][0]!=-1: pos=self.uf[pos][0] return pos def size(self,node): return self.uf[self.root(node)][2] def undo(self): if len(self.ope)>0: use=self.ope.pop() for i,j in use[1:]: self.uf[i]=j[:] uni=RollbackUnionFind(N+1) for h in range(H): for w in range(W): if A[h][w]==-1: continue p=A[h][w] for x,y in B: nh,nw=h+x,w+y if 0<=nh