#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define PII pair<int,int>
#define All(a) a.begin(),a.end()
#define F(x) abs(a[x]+d-it->first)
#define G(x) abs(a[x]-d-it->first)
using namespace std;
const int mx=2e5+5;
int n,m,cnt,a[mx],bl[mx],dp[mx],fa[mx],vis[mx],s,d,k;
set<PII> A;
vector<PII> g[mx];
vector<int> f[mx];
void dfs(int x,int fa) {
	for(auto y:g[x]) {
		if(vis[y.first]) continue; vis[y.first]=1;
		dp[y.first]=max(dp[x],y.second);
		dfs(y.first,x);
	}
}
int find(int x) {
	return (fa[x]==x)?x:fa[x]=find(fa[x]);
}
void unionset(int x,int y) {
	int u=find(x),v=find(y);
	if(u!=v) fa[u]=v;
}
void Boruvka() {
	for(int i=1;i<=n;i++) bl[i]=i,fa[i]=i; cnt=n;
	while(cnt>1) {
		A.clear(); for(int i=1;i<=n;i++) vis[i]=0;
		for(int i=1;i<=n;i++) A.insert(make_pair(a[i],i));
		for(int i=1;i<=cnt;i++) f[i].clear();
		for(int i=1;i<=n;i++) f[bl[i]].push_back(i);
		for(int i=1;i<=cnt;i++) {
			for(auto x:f[i]) {
				A.erase(make_pair(a[x],x));
			}
			int u(0),v(0),Min=INF;
			for(auto x:f[i]) {
				auto it=A.lower_bound(make_pair(a[x]+d,0));
				if(it!=A.end() && F(x) < Min) {
					Min = F(x);
					u = x; v = it->second;
				}
				if(it--!=A.begin() && F(x) < Min) {
					Min = F(x);
					u = x; v = it->second;
				}
				it=A.lower_bound(make_pair(a[x]-d,0));
				if(it!=A.end() && G(x) < Min) {
					Min = G(x);
					u = x; v = it->second;
				}
				if(it--!=A.begin() && G(x) < Min) {
					Min = G(x);
					u = x; v = it->second;
				}
			}
			unionset(u,v); g[u].push_back(make_pair(v,Min)),g[v].push_back(make_pair(u,Min));
			for(auto x:f[i]) {
				A.insert(make_pair(a[x],x));
			}
		}
		cnt=0;
		for(int i=1;i<=n;i++) {
			if(!vis[find(i)]) {
				vis[find(i)]=++cnt;
			}
			bl[i]=vis[find(i)];
		}
	}
}
int main() {
	scanf("%d%d%d%d",&n,&m,&s,&d);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	Boruvka();
	memset(vis,0,sizeof(vis)),vis[s]=1,dfs(s,0);
	for(int i=1;i<=m;i++) {
		int x; scanf("%d%d",&x,&k);
		printf("%s\n",(k>=dp[x])?"yes":"no");
	}
    return 0;
} 
