#include <bits/stdc++.h>

using namespace std;
const int N = 2e5 + 10, INF = 0x3f3f3f3f;

struct node {
    int x, k;

    inline bool operator<(node a) const {
        return k > a.k;
    }
};

int n, q, s, d, a[N], f[N];
priority_queue<node> h;
set<int> jump, stone;

inline int get(int x) {
    auto it = jump.lower_bound(a[x]);
    int ans = INF;
    if (it != jump.end())ans = min(ans, *it - a[x]);
    if (it != jump.begin())ans = min(ans, a[x] - *prev(it));
    return ans;
}

int main() {
    scanf("%d%d%d%d", &n, &q, &s, &d);
    for (int i = 1; i <= n; i++)scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++)stone.insert(i);
    memset(f + 1, -1, sizeof(int) * n), h.push({s, 0});
    while (!h.empty()) {
        auto t = h.top();
        h.pop(), stone.erase(t.x);
        if (f[t.x] >= 0)continue;
        f[t.x] = t.k;
        for (int v:{a[t.x] - d, a[t.x] + d}) {
            jump.insert(v);
            auto it = stone.lower_bound(lower_bound(a + 1, a + 1 + n, v) - a);
            if (it != stone.end())h.push({*it, max(t.k, a[*it] - v)});
            if (it != stone.begin())--it, h.push({*it, max(t.k, v - a[*it])});
        }
        auto it = stone.lower_bound(t.x);
        if (it != stone.end())h.push({*it, max(t.k, get(*it))});
        if (it != stone.begin())--it, h.push({*it, max(t.k, get(*it))});
    }
    while (q--) {
        int i, k;
        scanf("%d%d", &i, &k);
        puts(k >= f[i] ? "Yes" : "No");
    }
    return 0;
}