#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>

const int N = 2e5 + 5;
const int INF = 0x3f3f3f3f;

int a[N];
int n, m, s, d;

// 树
struct Edge { int to, nxt, w; } edge[N << 1];
int head[N];
void add_edge(int u, int v, int w) {
	static int k = 1;
	edge[k] = (Edge){v, head[u], w};
	head[u] = k++;
}

std::vector<int> st[N]; // 连通块 
std::set<std::pair<int, int>> restset; // 全集
std::set<std::pair<int, std::pair<int, int>>> edges; // 树-辅助
int mnedge[N][3]; // 树-辅助

// 连通块
int fa[N];
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
void merge(int x, int y) { (x = find(x)) != (y = find(y)) ? fa[x] = y : 0; }

int distance(int x, int y) { return std::abs(std::abs(a[x] - a[y]) - d); }

// 树
int dis[N];
void dfs(int u, int fa) {
	for(int i = head[u]; i; i = edge[i].nxt)
		if(edge[i].to != fa) {
			int v = edge[i].to;
			dis[v] = std::max(dis[u], edge[i].w);
			dfs(v, u);
		}
}

int main() {
	scanf("%d%d%d%d", &n, &m, &s, &d);
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for(int i = 1; i <= n; i++) fa[i] = i, restset.insert({a[i], i});
	int cnt = 0;
	while(cnt < n - 1) {
		// 处理连通块内的点
		for(int i = 1; i <= n; i++) st[i].clear();
		for(int i = 1; i <= n; i++) st[find(i)].push_back(i);
		// 处理出从每个连通块出发的最小边
		for(int i = 1; i <= n; i++) mnedge[i][0] = INF;
		for(int i = 1; i <= n; i++) {
			if(find(i) != i) continue;
			for(auto it = st[i].begin(); it != st[i].end(); it++)
				restset.erase({a[*it], *it});
			for(int j : st[i]) {
				int mns[5] = {0, 0, 0, 0};
				std::set<std::pair<int, int>>::iterator it;
				it = restset.upper_bound({a[j] - d, 0}); if(it != restset.end()) mns[1] = it->second;
				it = restset.upper_bound({a[j] - d, 0}); if(it != restset.begin()) mns[2] = (--it)->second;
				it = restset.upper_bound({a[j] + d, 0}); if(it != restset.end()) mns[3] = it->second;
				it = restset.upper_bound({a[j] + d, 0}); if(it != restset.begin()) mns[4] = (--it)->second;
				// printf("%d -> %d, %d, %d, %d\n", i, mns[1], mns[2], mns[3], mns[4]);
				int mn = 0;
				for(int k = 1; k <= 4; k++)
					if(mns[k] && (mn == 0 || distance(j, mn) > distance(j, mns[k])))
						mn = mns[k];
				if(distance(j, mn) < mnedge[i][0])
					mnedge[i][0] = distance(j, mn), mnedge[i][1] = i, mnedge[i][2] = mn;
			}
			for(auto it = st[i].begin(); it != st[i].end(); it++)
				restset.insert({a[*it], *it});
		}
		// 把边放进 edges
		for(int i = 1; i <= n; i++) {
			if(!mnedge[i]) continue;
			if(fa[i] != i) continue;
			if(edges.find({mnedge[i][0], {mnedge[i][1], mnedge[i][2]}}) != edges.end()) continue;
			if(edges.find({mnedge[i][0], {mnedge[i][2], mnedge[i][1]}}) != edges.end()) continue;
			edges.insert({mnedge[i][0], {mnedge[i][1], mnedge[i][2]}});
		}
		// 将边加到树上
		while(!edges.empty()) {
			auto p = *edges.begin();
			edges.erase(edges.begin());
			if(find(p.second.first) == find(p.second.second)) continue;
			add_edge(p.second.first, p.second.second, p.first);
			add_edge(p.second.second, p.second.first, p.first);
			merge(p.second.first, p.second.second);
			cnt++;
			// printf("%d <-> %d, cnt = %d\n", p.second.first, p.second.second, cnt);
		}
	}
	if(cnt != n - 1) return 2;
	dfs(s, 0);
	while(m--) {
		int to, ds;
		scanf("%d%d", &to, &ds);
		if(dis[to] <= ds) puts("Yes");
		else puts("No");
	}
	return 0;
} /*
7 4 4 5
1 5 10 13 20 22 28
4 1
7 2
7 3
3 2
*/