#include <cstdio>
#include <algorithm>
#include <set>
#include <queue>
#include <memory.h>
using namespace std;
int N, M, K, hp, maxdf, df[30], DT[3020][3021];
set<int> D;
set<int>::iterator it;
struct AREA{ int x, y; } S[3010];
int abs(int a){ return a>0?a:-a; }
bool eval(int v)
{
    queue<int> Q;
    int visit[3030];
    memset(visit, -1, sizeof(visit));
    Q.push(0); visit[0] = 0;
    while(!Q.empty())
    {
        int t = Q.front(); Q.pop();
        if( visit[t] > K+1 ) return false;
        if( t == N+1 ) return true;
        for(int i = 0 ; i <= N+1 ; i++ )
            if( visit[i] == -1 && DT[t][i] <= v )
                visit[i] = visit[t] + 1, Q.push(i);
    }
    return false;
}
void make_all_df(int k, int d)
{
    D.insert(d);
    if( k == M ) return;
    make_all_df(k+1, d+df[k]);
    make_all_df(k+1, d);
}
int main()
{
    freopen(".14.in","r",stdin);
    freopen(".14.out","w",stdout);
    scanf("%d%d%d%d",&N,&M,&K,&hp);
    for(int i = 0 ; i < M ; i++ )
        scanf("%d", df+i), maxdf += df[i];
    make_all_df(0,0);
    for(int i = 1 ; i <= N ; i++ )
        scanf("%d%d", &S[i].x, &S[i].y);
    S[0] = {0,0}, S[N+1] = {1000, 1000};
    for(int i = 0 ; i <= N+1 ; i++ ) for(int j = 0 ; j <= N+1 ; j++ )
        DT[i][j] = abs(S[i].x-S[j].x)+abs(S[i].y-S[j].y);
    int s = 0, e = 2000, t;
    while( s < e )
    {
        t = (s+e)/2;
        if( eval(t) ) e = t;
        else s = t+1;
    }
    //printf("%d ", e);
    if( e <= hp ) printf("0");
    else if( maxdf+hp < e ) printf("-1");
    else
        printf("%d", *lower_bound(D.begin(), D.end(), e-hp));
}
