#include <cstdio>
#include <cstring>

#define N 200005

struct edge
{
    int v, w, x;
} e[N << 1];

int h[N], a[N], c[2][N], p[2][2][N], f[N], m[3][N], l[N], z, n, q, s, d, t, k, g;

inline int max(int a, int b) { return a > b ? a : b; }

int get(int x) { return f[x] == x ? x : f[x] = get(f[x]); }

void uni(int x, int y)
{
    int a = get(x), b = get(y);

    if (a != b)
    {
        f[a] = b;
        --g;
    }
}

inline void adde(int u, int v, int w)
{
    e[++z] = {v, w, h[u]};
    h[u] = z;
    e[++z] = {u, w, h[v]};
    h[v] = z;
}

void dfs(int u, int p, int x)
{
    // printf("DFS U %d P %d X %d\n", u, p, x);
    l[u] = x;

    for (int i = h[u]; i; i = e[i].x)
        if (e[i].v != p)
            dfs(e[i].v, u, max(x, e[i].w));
}

int main()
{
    scanf("%d%d%d%d", &n, &q, &s, &d);
    g = n;

    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        c[0][i] = i - 1;
        c[1][i] = i + 1;
        f[i] = i;
    }

    for (int j = 0; j < 2; j++)
    {
        int o = j ? d : -d;

        for (int i = n, b = n; i; i--)
        {
            while (b && a[b] > a[i] + o)
                --b;
            p[j][0][i] = b;
        }

        for (int i = 1, b = 1; i <= n; i++)
        {
            while (b <= n && a[b] < a[i] + o)
                ++b;
            p[j][1][i] = b;
        }
    }

    while (g > 1)
    {
        memset(m, 0x7f, sizeof m);

        for (int i = 1; i <= n; i++)
        {
            int y = get(i);

            for (int j = 0; j < 2; j++)
            {
                int o = j ? a[i] + d : a[i] - d;

                if (p[j][0][i] && o - a[p[j][0][i]] < m[0][y])
                {
                    m[0][y] = o - a[p[j][0][i]];
                    m[1][y] = i;
                    m[2][y] = p[j][0][i];
                }

                if (p[j][1][i] <= n && a[p[j][1][i]] - o < m[0][y])
                {
                    m[0][y] = a[p[j][1][i]] - o;
                    m[1][y] = i;
                    m[2][y] = p[j][1][i];
                }
            }
        }

        for (int i = 1; i <= n; i++)
        {
            if (get(i) == i && m[0][i] < 0x7f7f7f7f && get(m[2][i]) != i)
            {
                uni(m[1][i], m[2][i]);
                adde(m[1][i], m[2][i], m[0][i]);
                // printf("ADDE %d %d W %d\n", m[1][i], m[2][i], m[0][i]);
            }
        }

        for (int i = 1; i <= n; i++)
            if (c[0][i] && get(c[0][i]) == get(i))
                c[0][i] = c[0][c[0][i]];

        for (int i = n; i; i--)
            if (c[1][i] <= n && get(c[1][i]) == get(i))
                c[1][i] = c[1][c[1][i]];

        for (int j = 0; j < 2; j++)
        {
            for (int i = 1; i <= n; i++)
            {
                if (p[j][0][i] && get(p[j][0][i]) == get(i))
                    p[j][0][i] = c[0][p[j][0][i]];
                if (p[j][1][i] <= n && get(p[j][1][i]) == get(i))
                    p[j][1][i] = c[1][p[j][1][i]];
            }
        }
    }

    for (dfs(s, 0, 0); q--; puts(l[t] <= k ? "YES" : "NO"))
        scanf("%d%d", &t, &k);
    return 0;
}
