const max=137;
type pe=^e;
e=record
me:word;
next:pe;
end;
var f:text;
b:array[0..max,0..max] of pe;
a:array[1..2,0..50000] of longint;
n,m,w,h,i,sol,x,y,x2,y2:longint;
go,go2:pe;
begin
sol:=0;
for x:=0 to max do
for y:=0 to max do begin
new(b[x,y]);
b[x,y]^.next:=nil;
end;
assign(f,'ograzi.in');
reset(f);
readln(f,n,m,w,h);
for i:=1 to n do
begin
readln(f,a[1,i],a[2,i]);
x:=(a[1,i] div w) mod max+1;
y:=(a[2,i] div h) mod max+1;
go:=b[x,y];
while go^.next<>nil do go:=go^.next;
new(go2);
go2^.next:=nil;
go2^.me:=i;
go^.next:=go2;
end;
a[1,0]:=-2147483646;
a[2,0]:=-2147483646;
for i:=1 to m do
begin
readln(f,x,y);
x2:=(x div w) mod max+1;
y2:=(y div h) mod max+1;
go:=b[x2,y2]^.next;
while go<>nil do begin
if (a[1,go^.me]<=x) and (a[1,go^.me]+w>=x)
and (a[2,go^.me]<=y) and (a[2,go^.me]+h>=y) then inc(sol);
go:=go^.next;
end;
x2:=((x div w)-1) mod max+1;
y2:=(y div h) mod max+1;
go:=b[x2,y2]^.next;
while go<>nil do begin
if (a[1,go^.me]<=x) and (a[1,go^.me]+w>=x)
and (a[2,go^.me]<=y) and (a[2,go^.me]+h>=y) then inc(sol);
go:=go^.next;
end;
x2:=((x div w)-1) mod max+1;
y2:=((y div h)-1) mod max+1;
go:=b[x2,y2]^.next;
while go<>nil do begin
if (a[1,go^.me]<=x) and (a[1,go^.me]+w>=x)
and (a[2,go^.me]<=y) and (a[2,go^.me]+h>=y) then inc(sol);
go:=go^.next;
end;
x2:=(x div w) mod max+1;
y2:=((y div h)-1) mod max+1;
go:=b[x2,y2]^.next;
while go<>nil do begin
if (a[1,go^.me]<=x) and (a[1,go^.me]+w>=x)
and (a[2,go^.me]<=y) and (a[2,go^.me]+h>=y) then inc(sol);
go:=go^.next;
end;
end;
close(f);
assign(f,'ograzi.out');
rewrite(f);
writeln(f,sol);
close(f);
end.