#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define int int64_t
#define vi vector<int>
#define vvi vector<vi>
#define vvvi vector<vvi>
#define pii pair<int, int>
#define vpi vector<pii>
#define vb vector<bool>
#define umap unordered_map
using namespace std;
//using namespace __gnu_pbds;
mt19937 rng(333);
//template<class T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
//template<class T> using omset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
void solve() {
	int n, m, k, x;
	cin >> n >> m >> k >> x;
	vpi T(n, {0, 0}); for (int i=0; i<n; ++i) cin >> T[i].first >> T[i].second;
	vpi temp(m, {0, 0}); for (int i=0; i<m; ++i) cin >> temp[i].first >> temp[i].second;
	sort(temp.begin(), temp.end());
	vpi N;
	for (pii& e : temp) {
		while (!N.empty()) {
			if (N.back().second < e.second) break;
			N.pop_back();
		}
		if (N.empty() || N.back().first < e.first) N.push_back(e);
	}
	swap(N, temp);
	int M = 0;
	for (pii& e : T) M = max(M, e.first);
	if (M > temp.back().first) {
		cout << "No\n";
		return;
	}
	pii tp;
	umap<int, int> D;
	int h;
	vb vis(m, false);
	vi p;
	vi K;
	for (int i=0; i<n; ++i) {
		tp = {T[i].first, 0};
		h = lower_bound(temp.begin(), temp.end(), tp)-temp.begin();
		T[i].first = temp[h].second;
		/*
		if (!vis[x]) {
			vis[x] = true;
			K.push_back(x);
			p.push_back(temp[x].second);
		}
		*/
	}
	/*
	sort(K.begin(), K.end());
	sort(p.begin(), p.end());
	m = p.size();
	for (int i=0; i<m; ++i) {
		D[K[i]] = i;
	}
	for (int i=0; i<n; ++i) {
		T[i].first = D[T[i]];
	}
	*/
	set<pii> S;
	S.insert({0, x});
	pii cur;
	int ind;
	int st;
	int rew;
	int nxt;
	vi best(n, -1);
	best[0] = x;
	for (int i=0; i<n; ++i) {
		if (best[i] == -1) continue;
		ind = i;
		rew=0;
		while (ind < n) {
			if (T[ind].first > best[i]) break;
			nxt = ind;
			while (nxt < n && nxt-ind <= k) {
				if (T[nxt].first > T[ind].first) break;
				rew += T[nxt].second;
				nxt++;
			}
			if (nxt == n) {
				cout << "Yes\n";
				return;
			}
			best[nxt] = max(best[nxt], best[i]+rew-T[ind].first);
			ind = nxt;
		}
	}
	cout << "No\n";
}
signed main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	int t=1; //cin >> t;
	while (t--) solve();
	return 0;
}
