#include <stdio.h>
#include <math.h>

#define NMAX 101
#define MMAX 101

const double EPS = 1.0e-10;

int grafo[NMAX+MMAX][NMAX+MMAX], marc[NMAX+MMAX];
int n, m;

int cmp(double a, double b) {
	if (fabs(a-b)<EPS) {
		return 0;
	} else if (a>b) {
		return 1;
	} else {
		return -1;
	}
}

struct tponto {
	double x;
	double y;
};

double distancia(struct tponto a, struct tponto b) {
	double x, y, d;

	x=b.x-a.x;
	y=b.y-a.y;
	d=sqrt(pow(x, 2)+pow(y, 2));

	return d;
}

int dfs(int v) {
	int w, achou=0;

	for (w=0; w<n+m; w++) {
		if (grafo[v][w]==1&&marc[w]==0) {
			marc[w]=1;
			if (dfs(w)==1) {
				grafo[w][v]=1;
				grafo[v][w]=0;
				return 1;
			}
			marc[w]=0;
			achou=1;
		}
	}

	if (v>=n&&achou==0) {
		return 1;
	}

	return 0;	
}

int main() {
	int s, v;
	int i, j;
	int md, conta=0;
	struct tponto gopher[NMAX];
	struct tponto hole;

	scanf("%d %d %d %d", &n, &m, &s, &v);

	md=v*s;

	for (i=0; i<n; i++) {
		scanf("%lf %lf", &gopher[i].x, &gopher[i].y);
	}
	for (i=0; i<n+m; i++) {
		for (j=0; j<n+m; j++) {
			grafo[i][j]=0;
		}
	}

	for (i=0; i<m; i++) {
		scanf("%lf %lf", &hole.x, &hole.y);
		for (j=0; j<n; j++) {
			if (cmp(distancia(hole, gopher[j]), md)<=0) {
				grafo[j][n+i]=1;
			}
		}
	}

	for (i=0; i<n; i++) {
		while (1) {
			for (j=0; j<n+m; j++) {
				marc[j]=0;
			}
			marc[i]=1;
			if (dfs(i)==0) {
				break;
			}
		}
	}

	for (i=0; i<n; i++) {
		for (j=n; j<n+m; j++) {
			if (grafo[j][i]==1) {
				conta++;
				break;
			}
		}
	}

	printf("%d\n", n-conta);

	return 0;
}

