#include <bits/stdc++.h>
#define SIZE 1000002
using namespace std;
ifstream f("ograzi.in");
ofstream g("ograzi.out");
int n,m,w,h;
struct coord
{
int x,y;
}o[SIZE],ogr[SIZE/2];
map<pair<int,int>,vector<int>>d;
int verif(int x,int y,int o1,int o2)
{
if(d.find(make_pair(x,y))==d.end())return 0;
int i,oaie,nr=0;
for(i=0;i<d[make_pair(x,y)].size();i++)
{
oaie=d[make_pair(x,y)][i];
if((o[oaie].x>=o1 && o[oaie].x<=o1+w) && (o[oaie].y>=o2 && o[oaie].y<=o2+h))nr++;
}
return nr;
}
int main()
{
int i,x,y,sol=0;
f>>n>>m>>w>>h;
for(i=1;i<=n;i++)
{
f>>ogr[i].x>>ogr[i].y;
}
for(i=1;i<=m;i++)
{
f>>o[i].x>>o[i].y;
if(o[i].x%w && o[i].y%h)d[make_pair(o[i].x/w+1,o[i].y/h+1)].push_back(i);
else if(!(o[i].x%w) && o[i].y%h){
d[make_pair(o[i].x/w+1,o[i].y/h+1)].push_back(i);
d[make_pair(o[i].x/w,o[i].y/h+1)].push_back(i);
}
else if(o[i].x%w && !(o[i].y%h)){
d[make_pair(o[i].x/w+1,o[i].y/h+1)].push_back(i);
d[make_pair(o[i].x/w+1,o[i].y/h)].push_back(i);
}
else{
d[make_pair(o[i].x/w,o[i].y/h+1)].push_back(i);
d[make_pair(o[i].x/w,o[i].y/h)].push_back(i);
d[make_pair(o[i].x/w+1,o[i].y/h+1)].push_back(i);
d[make_pair(o[i].x/w+1,o[i].y/h)].push_back(i);
}
}
for(i=1;i<=n;i++)
{
x=ogr[i].x;
y=ogr[i].y;
if(!(x%w) && !(y%h))
{
sol+=d[make_pair(x/w+1,y/h+1)].size();
}
else if(!(x%w) && y%h){
sol+=verif(x/w+1,y/h+1,x,y);
sol+=verif(x/w+1,y/h+2,x,y);
}
else if(x%w && !(y%h)){
sol+=verif(x/w+1,y/h+1,x,y);
sol+=verif(x/w+2,y/h+1,x,y);
}
else
{
sol+=verif(x/w+1,y/h+1,x,y);
sol+=verif(x/w+2,y/h+1,x,y);
sol+=verif(x/w+1,y/h+2,x,y);
sol+=verif(x/w+2,y/h+2,x,y);
}
}
g<<sol;
}