#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<map>
#include<vector>

#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> Line;

int deq[10001];
int N,M,D,X;
ll p[10000],x[10000],y[10000];
ll w[101][10000];
ll dp[2][10000];
Line ch[10000];
const ll INF = 1e14;

ll f(int d,int j,int x){
  return w[d][j] * p[x] + dp[d&1][j] - w[d][j]*p[j];
}

bool check(int d, int f1,int f2, int f3){
  ll a1 = w[d][f1], b1 = dp[d&1][f1] - w[d][f1]*p[f1];
  ll a2 = w[d][f2], b2 = dp[d&1][f2] - w[d][f2]*p[f2];
  ll a3 = w[d][f3], b3 = dp[d&1][f3] - w[d][f3]*p[f3];
  return (a2-a1)*(b3-b2) >= (b2-b1)*(a3-a2);
}

int main(){
  cin >> N >> M >> D >> X;
  for(int i=0;i<N;i++)cin >> p[i];

  for(int i=0;i<M;i++){
    cin >> x[i] >> y[i];
    x[i] -= abs(y[i]);
  }
  sort(x,x+M);

  for(int d=0;d<D;d++){
    int cur = 0;
    for(int i=0;i<N;i++){
      while(cur<M && p[i]>x[cur]+d*X)cur++;
      w[d][i] = M-cur;
    }
  }

  for(int i=0;i<N;i++)dp[0][i] = INF;
  dp[0][0] = 0;
  
  for(int i=0;i<D;i++){
    int now = i&1, nxt = 1-now;
    for(int j=0;j<N;j++)dp[nxt][j] = INF;

    int s = 0, t = 1;
    deq[0] = 0;

    for(int j=0;j<N;j++){
      if(j-1>=0){
	while(s+1<t && check(i, deq[t-2], deq[t-1], j-1))t--;
	deq[t++] = j-1;
      }

      while(s+1<t && f(i,deq[s],j) >= f(i,deq[s+1],j))s++;

      dp[nxt][j] = min(dp[nxt][j], dp[now][j]);
      dp[nxt][j] = min(dp[nxt][j], f(i,deq[s],j));
    }
  }

  cout << dp[D&1][N-1] << endl;
}