#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

const int N=200000,INF=(1<<30)-1;

int n,cq,st,m,a[N+9];
map<int,int>mp;

void into(){
  scanf("%d%d%d%d",&n,&cq,&st,&m);
  for (int i=1;i<=n;++i){
    scanf("%d",&a[i]);
    mp[a[i]]=i;
  }
}

struct state{
  int x,y,v;
  state(int X=0,int Y=0,int V=0){x=X;y=Y;v=V;}
  bool operator > (const state &p)const{return v>p.v;}
};
priority_queue<state,vector<state>,greater<state> >q;
int lim[N+9];

void Get_q(int x,int p){
  auto it=mp.lower_bound(p);
  if (it!=mp.end())
    q.emplace(x,it->second,it->first-p);
  if (it!=mp.begin()){
    --it;
    q.emplace(x,it->second,p-it->first);
  }
}

void Get_mn(){
  for (int i=1;i<=n;++i) lim[i]=-1;
  q.emplace(st,st,0);
  for (;!q.empty();){
    auto [x,y,v]=q.top();q.pop();
    if (lim[y]!=-1) continue;
    lim[y]=max(lim[x],v);
    mp.erase(a[y]);
    Get_q(x,a[x]-m);
    Get_q(x,a[x]+m);
    Get_q(y,a[y]-m);
    Get_q(y,a[y]+m);
  }
}

void work(){
  Get_mn();
}

void outo(){
  for (;cq--;){
    int x,y;
    scanf("%d%d",&x,&y);
    puts(lim[x]<=y?"Yes":"No");
  }
}

int main(){
  int T=1;
  //scanf("%d",&T);
  for (;T--;){
    into();
    work();
    outo();
  }
  return 0;
}