#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


#define NUM 30005

class Point{
public:
	double x,y;

	Point(double x = 0,double y = 0):x(x),y(y){}

	Point operator + (Point p){ return Point(x+p.x,y+p.y); }
	Point operator - (Point p){ return Point(x-p.x,y-p.y);}
	Point operator * (double a){ return Point(a*x,a*y); }
	Point operator / (double a){ return Point(x/a,y/a); }

	double abs(){ return sqrt(norm()); }
	double norm(){ return x*x + y*y; }

	bool operator<(const Point &p) const{
		return x != p.x? x < p.x: y < p.y;
	}

	bool operator == (const Point &p) const{
		return fabs(x-p.x) < EPS && fabs(y-p.y) < EPS;
	}
};

typedef Point Vector;
typedef vector<Point> Polygon;

struct Info{
	int value;
	Polygon polygon;
	double min_y,max_y,S;
};

int num_almond,num_section;
int ruiseki_value[NUM];
double W,H,total_S,need_S;
double ruiseki_S[NUM];
Info info[NUM];
Point pre_L,pre_R,L,R;

double norm(Vector a){
	return a.x*a.x+a.y*a.y;
}

double abs(Vector a){
	return sqrt(norm(a));
}

//ベクトルaとbの外積を求める関数
double cross(Vector a,Vector b){
	return a.x*b.y-a.y*b.x;
}

//ベクトルaとbの内積を求める関数
double dot(Vector a,Vector b){
	return a.x*b.x + a.y*b.y;
}

Point calc_minus(Point a,Point b){
	Point ret;

	ret.x = a.x-b.x;
	ret.y = a.y-b.y;

	return ret;
}

/*
 * IN 2
 * ON 1
 * OUT 0
 *
 */
int contains(Polygon g,Point p){
	int n = g.size();
	bool x = false;
	for(int i = 0; i < n; i++){
		Point a = g[i]-p,b = g[(i+1)%n]-p;
		if(abs(cross(a,b)) < EPS && dot(a,b) < EPS)return 1;
		if(a.y > b.y)swap(a,b);
		if(a.y < EPS && EPS < b.y && cross(a,b) > EPS) x = !x;
	}
	return (x ? 2:0);
}

void func(){

	for(int i = 0; i < num_section; i++){
		info[i].value = 0; //断片内のアーモンドの個数
		info[i].polygon.clear();
	}

	pre_L.x = 0;
	pre_R.x = W;

	pre_L.y = 0;
	pre_R.y = 0;

	L.x = 0;
	R.x = W;

	for(int i = 0; i < num_section; i++){

		scanf("%lf %lf",&L.y,&R.y);

		//左下から反時計回りに点を記録
		info[i].polygon.push_back(pre_L);
		info[i].polygon.push_back(pre_R);
		info[i].polygon.push_back(R);
		info[i].polygon.push_back(L);

		info[i].min_y = min(pre_L.y,pre_R.y);
		info[i].max_y = max(L.y,R.y);

		info[i].S = (((L.y-pre_L.y)+(R.y-pre_R.y))*W)/2.0; //台形の面積

		pre_L = L;
		pre_R = R;
	}

	//アーモンドの処理
	Point tmp;
	int left,right,m;
	int min_index,max_index;

	for(int loop = 0; loop < num_almond; loop++){

		scanf("%lf %lf",&tmp.x,&tmp.y);

		//アーモンドが所属し得る最小のインデックスを求める
		left = 0,right = num_section-1,m = (left+right)/2;
		min_index = num_section-1;

		while(left <= right){
			if(info[m].max_y > tmp.y){

				min_index = m;
				right = m-1;

			}else{

				left = m+1;

			}
			m = (left+right)/2;
		}

		//アーモンドが所属し得る最大のインデックスを求める
		left = 0,right = num_section-1,m = (left+right)/2;
		max_index = 0;

		while(left <= right){

			if(info[m].min_y < tmp.y){

				max_index = m;
				left = m+1;

			}else{

				right = m-1;
			}
			m = (left+right)/2;
		}

		if(min_index > max_index)continue;

		for(int i = min_index; i <= max_index; i++){

			if(contains(info[i].polygon,tmp) == 2){ //問題仕様上、ONは無いはず
				info[i].value++;
				break;
			}
		}
	}

	//累積和テーブルを作成する
	ruiseki_S[0] = info[0].S;
	ruiseki_value[0] = info[0].value;

	for(int i = 1; i < num_section; i++){
		ruiseki_S[i] = info[i].S;
		ruiseki_S[i] += ruiseki_S[i-1];
		ruiseki_value[i] = info[i].value;
		ruiseki_value[i] += ruiseki_value[i-1];
	}

	total_S = H*W;
	int ans = num_almond;

	double tmp_S;
	int tmp_almond;

	for(int i = 0; i < num_section; i++){
		/*★シータの面積は大きいほど良い★*/

		//2分探索で、残チョコの面積がS以上となる、最大の上端を求める
		left = 0,right = num_section-1,m = (left+right)/2;

		while(left <= right){
			//シータの面積を求める
			if(i != 0){

				tmp_S = ruiseki_S[m]-ruiseki_S[i-1];

			}else{

				tmp_S = ruiseki_S[m];
			}

			if(total_S-tmp_S >= need_S){ //残りがneed_S以上

				if(i != 0){

					tmp_almond = ruiseki_value[m]-ruiseki_value[i-1];

				}else{

					tmp_almond = ruiseki_value[m];
				}

				ans = min(ans,num_almond-tmp_almond);

				left = m+1;

			}else{
				right = m-1;
			}
			m = (left+right)/2;
		}
	}
	printf("%d\n",ans);
}

int main(){

	while(true){
		scanf("%d %d %lf %lf %lf",&num_almond,&num_section,&W,&H,&need_S);
		if(num_almond == 0 && num_section == 0)break;

		func();
	}
	return 0;
}



Measured memory_bytes: 7540