#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#define int long long
#define pll pair <int, int>
#define f first
#define s second
#define all(A) A.begin(), A.end()
#define rall(A) A.rbegin(), A.rend()
#define oset ordered_set
#define omultiset ordered_multiset
#define skip continue
#pragma GCC target("avx2")
#pragma GCC optmize("O3")
#pragma GCC optmize("unroll-loops")

using namespace std;
using namespace __gnu_pbds;

template <typename T> using ordered_set = tree<T, null_type, less<>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T> using ordered_multiset = tree<T, null_type, less_equal<>, rb_tree_tag, tree_order_statistics_node_update>;

const int N = 5e5 + 5, MOD = 998244353;
int precalc[N], b[N], a[N];
map <pll, int> cnt_inter;
pll lr[N];

int bin_pow(int x, int n) {
    int res = 1;
    while (n) {
        if ((n & 1)) res = res * x % MOD;
        n >>= 1;
        x = x * x % MOD;
    }
    return res;
}

int scan() {
    int x; cin >> x;
    return x;
}

string read() {
    string s; cin >> s;
    return s;
}

int get_pos(int time, int m, int i, string &napravlenie) {
    time += a[i];
    int z = time / m + (napravlenie[i] == 'R' ? 0 : 1);
    return (z % 2 ? m - time % m : time % m + 1);
}

void SLAVA_MORDOVII() {
    int TYPE = scan();
    int n = scan(), m = scan();
    for (int i = 0; i < n; i++) a[i] = scan();
    string s = read();
    int pos1 = a[0], pos2 = a[1];
    int nap1 = 1 - 2 * (s[0] == 'L');
    int nap2 = 1 - 2 * (s[1] == 'L');
    for (int t = 0; t < 100000 * m; t++) {
        if (pos1 == pos2) {
            while (true) {}
            cout << "Yes\n";
            if (TYPE == 2 || TYPE == 3) cout << pos1 << '\n';
            if (TYPE == 3) cout << "1\n" << t << ' ' << pos1 << '\n';
            return;
        }
        pos1 += nap1;
        if (pos1 == 0) {
            nap1 = 1; pos1 = 2;
        }
        if (pos1 == m + 1) {
            nap1 = -1, pos1 = m - 1;
        }
        pos2 += nap2;
        if (pos2 == 0) {
            nap2 = 1; pos2 = 2;
        }
        if (pos2 == m + 1) {
            nap2 = -1, pos2 = m - 1;
        }
        //cout << pos1 << ' ' << pos2 << '\n';
    }
    cout << "No\n";
}

void solve2() {
    int n = scan(), m = scan(), k = scan(), x = scan();
    vector <pll> mob(n + 1);
    for (int i = 0; i < n; i++) mob[i] = {scan(), scan()};
    vector <pll> sword(m);
    for (int i = 0; i < m; i++) sword[i] = {scan(), scan()};
    sort(all(sword));
    vector <int> suff_min(m + 2);
    suff_min[m] = 1e18;
    vector <int> need_sword_suff(m + 1);
    map <int, int> max_power;
    for (int i = m - 1; i >= 0; i--) {
        if (suff_min[i + 1] > sword[i].s) {
            need_sword_suff[i] = sword[i].f;
            suff_min[i] = sword[i].s;
        }
        else {
            need_sword_suff[i] = need_sword_suff[i + 1];
            suff_min[i] = suff_min[i + 1];
        }
        max_power[sword[i].s] = max(max_power[sword[i].s], sword[i].f);
    }
    int cur_s = 0, cur_use = 0;
    for (int i = 0; i < n; i++) {
        if (cur_s < mob[i].f || cur_use >= k) {
            auto it = lower_bound(all(sword), (pll){mob[i].f, (int)-1e18}) ;
            if (it == sword.end()) {
                cout << "No\n"; return;
            }
            int ind = it - sword.begin();
            int need_cost = suff_min[ind];
            x -= need_cost;
            if (x < 0) {
                cout << "No\n"; return;
            }
            cur_s = need_sword_suff[ind];
            cur_use = 0;
        }
        cur_use++;
        x += mob[i].s;
    }
    cout << "Yes\n";
}

int32_t main() {
    solve2();
}