#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
using ll = long long;

using oset = tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update>;

void Solve();

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    ll tt = 1;
    // cin >> tt;
    while (tt--) {
        Solve();
    }
    return 0;
}

# define ff first
# define ss second

const ll inf = 1e15;

const ll NMAX = 5e5 + 10;
const ll LG = 20;

ll st[LG][NMAX];

void Solve() {
    ll n, m, k, x;
    cin >> n >> m >> k >> x;
    vector<pair<ll, ll>> a(n);
    for (auto &x : a) cin >> x.ff >> x.ss;
    for (ll i = 0; i < n; ++i) {
        st[0][i] = a[i].ff;
    }
    for (ll i = 1; i < LG; ++i) {
        for (ll j = 0; j <= n - (1 << i); ++j) {
            st[i][j] = max(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]);
        }
    }
    auto get = [&](ll l, ll r) -> ll {
        ll lg = __lg(r - l + 1);
        return max(st[lg][l], st[lg][r - (1 << (lg - 1))]);
    };
    vector<pair<ll, ll>> b(m);
    for (auto &x : b) cin >> x.ff >> x.ss;
    sort(b.begin(), b.end(), [&](auto f, auto s) {
        if (f.ss == s.ss) return f.ff > s.ff;
        return f.ss < s.ss;
    });
    vector<pair<ll, ll>> c;
    c.push_back(b[0]);
    for (auto &x : b) {
        if (x.ff > c.back().ff) {
            c.push_back(x);
        }
    }
    swap(b, c);
    m = b.size();
    vector<ll> pos;
    ll ptr = 0;
    for (ll i = 0; i < n; ++i) {
        while (ptr < m && a[i].ff > b[ptr].ff) {
            pos.push_back(i);
            ptr++;
        }
    }
    vector<ll> pref(n + 1);
    for (ll i = 0; i < n; ++i) {
        pref[i + 1] = pref[i] + a[i].ss;
    }
    vector<ll> dp(n + 1, -inf);
    dp[0] = x;
    for (ll i = 0; i < n; ++i) {
        for (ll j = 0; j < m; ++j) {
            if (b[j].ff < a[i].ff || dp[i] < b[j].ss) continue;
            ll l = i, r = min(n, i + k);
            while (l < r - 1) {
                ll mid = (l + r) / 2;
                if (get(i, mid) > b[j].ff) {
                    r = mid;
                } else {
                    l = mid;
                }
            }
            dp[r] = max(dp[r], dp[i] - b[j].ss + pref[r] - pref[i]);
        }
    }
    cout << (dp[n] >= 0 ? "Yes" : "No");
}