#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define per(i, a, b) for(int i=(b)-1; i>=(a); i--)
#define sz(a) (int)a.size()
#define de(a) cout << #a << " = " << a << endl
#define dd(a) cout << #a << " = " << a << " "
#define all(a) a.begin(), a.end()
#define pw(x) (1ll<<(x))
#define endl "\n"
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef double db;
const int INF=1e9;
const int N=1e6+5;
struct node{
	int preid,id,val;
	bool operator <(node b) const{
		return val>b.val; 
	}
};
priority_queue<node> qq;
set<int> st;
map<int,int> pos;
int a[N],l1[N],r1[N],l2[N],r2[N];
int d;
int calmin(int x){
	auto it=st.lower_bound(a[x]+d);
	r1[x]=pos[(*it)];
	it--;
	l1[x]=pos[(*it)];
	if(l1[x]==x) l1[x]=r1[x];
	it=st.lower_bound(a[x]-d);
	r2[x]=pos[(*it)];
	it--;
	l2[x]=pos[(*it)];
	if(r2[x]==x) r2[x]=l2[x];
	
	return min(min(abs(a[x]+d-a[r1[x]]),abs(a[x]+d-a[l1[x]])),min(abs(a[x]-d-a[r2[x]]),abs(a[x]-d-a[l2[x]])));
}
int n;
int calpos(int x){
	auto it=st.lower_bound(a[x]+d);
//	de((*it));
	r1[x]=pos[(*it)];
	it--;
	l1[x]=pos[(*it)];
	if(l1[x]==x) l1[x]=r1[x];
	it=st.lower_bound(a[x]-d);
	r2[x]=pos[(*it)];
	it--;
	l2[x]=pos[(*it)];
	if(r2[x]==x) r2[x]=l2[x];
	
//	dd(l1[x]),dd(r1[x]),dd(l2[x]),de(r2[x]);
	
	int mn=calmin(x);
	if(abs(a[x]+d-a[r1[x]])==mn){
		return r1[x];
	}
	else if(abs(a[x]+d-a[l1[x]])==mn){
		return l1[x];
	}
	else if(abs(a[x]-d-a[r2[x]])==mn){
		return r2[x];
	}
	else if(abs(a[x]-d-a[l2[x]])==mn){
		return l2[x];
	}
}
vector<int> v[N];
int ans[N];
int main(){
	int q,s;
	scanf("%d%d%d%d",&n,&q,&s,&d);
	a[0]=-INF;a[n+1]=a[n+2]=INF;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		pos[a[i]]=i;
		v[i].pb(i);
		st.insert(a[i]);
	}
	pos[-INF-1]=0;
	pos[-INF]=0;
	pos[INF]=n+1;
	pos[INF+1]=n+2;
	st.insert(-INF-1);
	st.insert(-INF);
	st.insert(INF);
	st.insert(INF+1);
	for(int i=1;i<=n;i++){
		ans[i]=INF;
	}
	ans[s]=0;
	qq.push({0,s,0});
	while(!qq.empty()){
		node top=qq.top();
		if(top.val>1e8) break;
//		dd(top.preid),dd(top.id),de(top.val); 
		qq.pop();
		 
		if((*st.lower_bound(a[top.id]))!=a[top.id]){
			int p2=calpos(top.preid),mn2=max(ans[top.preid],calmin(top.preid));
//			dd(p2),de(mn2);
			if(top.preid){
				if(mn2<ans[p2])
				ans[p2]=mn2;
//				dd(top.preid),dd(p2),de(mn2);
				qq.push({top.preid,p2,mn2});
			}
			continue;
		}
//		de(a[top.id]);
		st.erase(st.lower_bound(a[top.id]));
		int p2=calpos(top.preid),mn2=max(ans[top.preid],calmin(top.preid));
//		dd(p2),de(mn2);
		if(top.preid){
			if(mn2<ans[p2])
			ans[p2]=mn2;
//			dd(top.preid),dd(p2),de(mn2);
			qq.push({top.preid,p2,mn2});
		}
		int p=calpos(top.id),mn=max(ans[top.id],calmin(top.id));
//		dd(p),de(mn); 
		if(mn<ans[p]){
			ans[p]=mn;
//			dd(top.id),dd(p),de(mn);
		}
		qq.push({top.id,p,mn});
	} 
//	for(int i=1;i<=n;i++){
//		dd(i),de(ans[i]);
//	}
	while(q--){
		int i,k;
		scanf("%d%d",&i,&k);
		if(ans[i]>k){
			printf("No\n");
		}
		else{
			printf("Yes\n");
		} 
	}
}
