#include<stdio.h>
#include<vector>
using namespace std;
const int MOD = 53639;
void getxy (int &x, int &y) {
int i;
char ln[20];
gets(ln);
x = y = 0;
for(i = 0; ln[i] != NULL; ++ i)
if(ln[i] >= '0' && ln[i] <= '9')
x = x * 10 + ln[i] - '0';
else
break;
for(; ln[i] != NULL; ++ i)
if(ln[i] >= '0' && ln[i] <= '9')
y = y * 10 + ln[i] - '0';
}
int height, width;
struct POINT {
int ogx, ogy, x, y;
POINT (int ogx = 0, int ogy = 0, int x = 0, int y = 0) {
this->ogx = ogx;
this->ogy = ogy;
this->x = x;
this->y = y;
}
};
vector <POINT> h[MOD + 5];
vector <POINT>::iterator it;
void get (int &i, int &j, int x, int y) {
i = x / width;
j = y / height;
if(x % width) ++ i;
if(y % height) ++ j;
}
void ins (int x, int y) {
int i, j;
get(i, j, x, y);
h[(i * 47 + j * 49) % MOD].push_back(POINT(i, j, x, y));
}
bool comprises (int i, int j, int x, int y) {
return x >= i && x <= i + width && y >= j && y <= j + height;
}
bool src (int i, int j, int x, int y) {
int f = (i * 47 + j * 49) % MOD;
for(it = h[f].begin(); it != h[f].end(); ++ it)
if(it->ogx == i && it->ogy == j && comprises(it->x, it->y, x, y))
return 1;
return 0;
}
int main() {
freopen("ograzi.in", "r", stdin);
freopen("ograzi.out", "w", stdout);
int i, j, k, x, y, nOgr, nOi, cnt;
scanf("%d%d%d%d\n", &nOgr, &nOi, &height, &width);
for(i = 1; i <= nOgr; ++ i) {
getxy(x, y);
ins(x, y);
}
cnt = 0;
for(k = 1; k <= nOi; ++ k) {
getxy(x, y);
get(i, j, x, y);
if(src(i, j, x, y) || src(i - 1, j, x, y) || src(i, j - 1, x, y) || src(i - 1, j - 1, x, y) || src(i + 1, j, x, y) || src(i, j + 1, x, y) || src(i + 1, j + 1, x, y))
++ cnt;
}
printf("%d", cnt);
return 0;
}