#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;
using ll = long long;
using ld = long long;
#define all(v) v.begin(), v.end()
#define int long long

typedef tree<int, null_type, less<>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

const int N = 5e5 + 10;
const long long inf = 1e18 + 10;

int h[N], r[N], c[N], s[N], dp[N], mn[N*4], abob[N], pref[N];

void build(int v, int lq, int rq) {
    mn[v] = inf;
    if (rq == lq + 1) {
        return;
    }
    int m = (lq + rq) / 2;
    build(v * 2, lq, m);
    build(v * 2+1, m, rq);
}

void add(int v, int lq, int rq, int x, int y) {
    if (rq == lq + 1) {
        mn[v] = min(mn[v], y);
        return;
    }
    int m = (lq + rq) / 2;
    if (x < m) {
        add(v * 2, lq, m, x, y);
    } else {
        add(v * 2 + 1, m, rq, x, y);
    }
    mn[v] = min(mn[v * 2], mn[v * 2 + 1]);
}

int get(int v, int lq, int rq, int x, int y) {
    if (rq <= x || y <= lq) {
        return inf;
    }
    if (x <= lq && rq <= y) {
        return mn[v];
    }
    int m = (lq + rq) / 2;
    return min(get(v * 2, lq, m, x, y), get(v * 2 + 1, m, rq, x, y));
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m, k, x;
    cin >> n >> m >> k >> x;
    for (int i = 1; i <= n; i++) {
        cin >> h[i] >> r[i];
    }
    vector<pair<int, int>> v;
    for (int i = 1; i <= m; i++) {
        cin >> s[i] >> c[i];
        v.push_back({s[i], i});
    }
    sort(all(v));
    int cnt = 0;
    vector<int> vc;
    vc.push_back(v[0].first);
    for (int i = 0; i < m; i++) {
        if (i != 0 && v[i].first != v[i-1].first) {
            vc.push_back(v[i].first);
            cnt++;
        }
        abob[v[i].second] = cnt;
    }
    cnt++;
    build(1, 0, cnt);
    h[n] = inf;
    for (int i = 1; i <= m; i++) {
        add(1, 0, cnt, abob[i], c[i]);
    }
    vector<pair<int, pair<int, int>>> vec;
    vec.push_back({n+1, {0, cnt}});
    dp[n + 1] = 0;
    for (int i = n; i >= 1; i--) {
        dp[i] = inf;
        while (vec.size() >= 1 && h[i] >= h[vec.back().first]) {


            vec.pop_back();
        }
        int y = lower_bound(all(vc), h[i]) - vc.begin();
        if (y < vc.size()) {
            int res = get(1, 0, cnt, y, cnt) + max(0ll, dp[i+1] - r[i]);
            dp[i] = min(dp[i], res);
        }
    }
    if (dp[1] <= x) {
        cout << "Yes";
    } else {
        cout << "No";
    }
    return 0;
}
