#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <assert.h>
#include <stack>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <unordered_set>
#include <set>
#include <time.h>
#include <unordered_map>
using namespace std;

const int N = 200010;
int pre[N], a[N];
int n, m, r, d;

int find(int x) {
	return pre[x] ? pre[x] = find(pre[x]) : x;
}

int get_dis(int x, int y) {
	return abs(abs(x - y) - d);
}

void update(int &x, int &y, int p, int q) {
	if (abs(p) == 1000000000 || abs(q) == 1000000000) return;
	if (get_dis(x, y) > get_dis(p, q)) {
		x = p, y = q;
	}
}

vector<int> v[N], w[N];

void add_edge(int x, int y, int d) {
	v[x].push_back(y);
	w[x].push_back(d);
	v[y].push_back(x);
	w[y].push_back(d);
}

void boruvka() {
	int cc = n;
	set<int> st;
	map<int, int> rev;
	for (int i = 1; i <= n; i++) {
		st.insert(a[i]);
		rev[a[i]] = i;
	}
	st.insert(-1000000000);
	st.insert(1000000000);

	while (cc > 1) {
        vector<int> blocks[N];
		pair<int, int> e[N];
		int cnt = 0;
	    for (int i = 1; i <= n; i++) {
			blocks[find(i)].push_back(i);
	    }	   

		for (int i = 1; i <= n; i++) {
			if (find(i) != i) continue;
			for (int j = 0; j < blocks[i].size(); j++) {
				st.erase(a[blocks[i][j]]);
			}
			int x = -1000000000, y = 1000000000;
			for (int j = 0; j < blocks[i].size(); j++) {
				int p = blocks[i][j];
				set<int>::iterator it = st.lower_bound(a[p] + d);
				update(x, y, a[p], *it);
				it--;
				update(x, y, a[p], *it);

				it = st.lower_bound(a[p] - d);
				update(x, y, a[p], *it);
				it--;
				update(x, y, a[p], *it);
			}

			if (x != -1000000000) e[++cnt] = make_pair(rev[x], rev[y]);
			for (int j = 0; j < blocks[i].size(); j++) {
				st.insert(a[blocks[i][j]]);
			}
		}

		for (int i = 1; i <= cnt; i++) {
			int x = e[i].first;
			int y = e[i].second;
			int fx = find(x);
			int fy = find(y);
			if (fx == fy) continue;
			pre[fx] = fy;
			cc--;
			add_edge(x, y, get_dis(a[x], a[y]));
		}
	}
}

int ans[N];

void dfs(int u, int fa, int mx) {
	ans[u] = mx;
	for (int i = 0; i < v[u].size(); i++) {
		int x = v[u][i];
		if (x == fa) continue;
		dfs(x, u, max(mx, w[u][i]));
	}
}

int main()
{
	scanf("%d%d%d%d", &n, &m, &r, &d);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);

	boruvka();

	dfs(r, 0, 0);
	while (m--) {
		int x, y;
		scanf("%d%d", &x, &y);
		if (ans[x] <= y) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}
