#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define f first
#define s second
#define pb push_back
#define pf push_front
#define in insert
#define elif else if
#define nl '\n'

typedef __int128 int128;
typedef long double ld;
#define  long  int64_t
#define ulong uint64_t
#define uint  uint32_t

using namespace std;
using namespace __gnu_pbds;
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());

template <class T>
using oset = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;

#define int long

const int N = 5e5 + 9, oo = 1e18;

vector <pair <int, int>> v;
int n, m, k, x, h[N], r[N], s[N], c[N], dp[N], mx[N], sfR[N];

int32_t main() {
    cin.tie(0); ios::sync_with_stdio(0);
    cin >> n >> m >> k >> x;
    for (int i = 0; i < n; ++i)
        cin >> h[i] >> r[i];
    for (int i = 0; i < m; ++i) {
        int s, c;
        cin >> s >> c;
        v.pb({s, c});
    }
    sort(v.begin(), v.end(), [](pair <int, int> a, pair <int, int> b) {
        if (a.f != b.f)
            return a.f < b.f;
        return a.s > b.s;
    });
    m = 0;
    for (auto u : v) {
        while (m && s[m - 1] >= u.s)
            --m;
        s[m] = u.f;
        c[m] = u.s;
        ++m;
    }
//    for (int i = 0; i < m; ++i)
//        cout << i << ": " << s[i] << " " << c[i] << nl;
    sfR[n - 1] = r[n - 1];
    for (int i = n - 2; i >= 0; --i)
        sfR[i] = sfR[i + 1] + r[i];
    fill(dp, dp + n + 1, -1);
    dp[0] = x;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m && c[j] <= dp[i]; ++j) {
            mx[j] = max(mx[j], i);
            while (mx[j] < n && h[mx[j]] <= s[j])
                ++mx[j];
            dp[min(mx[j], i + k)] = max(dp[min(mx[j], i + k)], dp[i] + sfR[i] - sfR[k] - c[j]);
            if (mx[j] >= i + k)
                break;
        }
    cout << (dp[n] == -1 ? "No" : "Yes");
}
