#include <bits/stdc++.h>
int CH, NEG;
template <typename TP>
inline void read(TP& ret) {
  ret = NEG = 0;
  while (CH = getchar(), CH < '!')
    ;
  if (CH == '-') NEG = true, CH = getchar();
  while (ret = ret * 10 + CH - '0', CH = getchar(), CH > '!')
    ;
  if (NEG) ret = -ret;
}
using namespace std;
int X, K, n, q, c[8];
long long mat[30][256][256], now[256], nxt[256], ans = 0;
vector<pair<int, int> > stone;
vector<int> sta;
inline void MI(long long& a, const long long& b) {
  if (a > b) a = b;
}
int main() {
  read(X), read(K), read(n), read(q);
  for (int i = (0); i < (K); i++) read(c[i]);
  for (int i = (0); i < (q); i++) {
    int p, w;
    read(p), read(w);
    if (p > n - X)
      ans += w;
    else
      stone.push_back(make_pair(p, w));
  }
  stone.push_back(make_pair(1, 0)), stone.push_back(make_pair(n - X + 1, 0));
  sort(stone.begin(), stone.end());
  memset(mat, 0x3f, sizeof mat);
  for (int s = ((1 << K) - 1); s >= (0); s--)
    if (__builtin_popcount(s) == X) {
      sta.push_back(s);
      int t = s >> 1;
      if (s & 1) {
        for (int i = (0); i < (K); i++)
          if (!((t >> i) & 1)) mat[0][s][t | (1 << i)] = c[i];
      } else
        mat[0][s][t] = 0;
    }
  for (int i = (1); i < (30); i++) {
    for (int s : sta)
      for (int t : sta)
        for (int k : sta) MI(mat[i][s][t], mat[i - 1][s][k] + mat[i - 1][k][t]);
  }
  memset(now, 0x3f, sizeof now);
  now[(1 << X) - 1] = 0;
  for (int k = (1); k < (stone.size()); k++) {
    int len = stone[k].first - stone[k - 1].first;
    for (int i = (0); i < (30); i++)
      if ((len >> i) & 1) {
        memset(nxt, 0x3f, sizeof(long long) * (1 << K));
        for (int s : sta)
          for (int t : sta) MI(nxt[t], now[s] + mat[i][s][t]);
        memcpy(now, nxt, sizeof(long long) * (1 << K));
      }
    for (int s = ((1 << K) - 1); s >= (0); s--)
      if (s & 1) now[s] += stone[k].second;
  }
  ans += now[(1 << X) - 1];
  printf("%lld\n", ans);
END:
  getchar(), getchar();
  return 0;
}
