#include <bits/stdc++.h>
using namespace std;
int X, K, n, m, q;
const long long inf = 1e18;
struct Mat {
  long long a[73][73];
  Mat() {
    for (int i = 1; i <= 70; i++)
      for (int j = 1; j <= 70; j++) a[i][j] = inf;
  }
  Mat operator*(const Mat &b) {
    Mat ans;
    for (int k = 1; k <= m; k++)
      for (int i = 1; i <= m; i++)
        for (int j = 1; j <= m; j++)
          ans.a[i][j] = min(ans.a[i][j], a[i][k] + b.a[k][j]);
    return ans;
  }
} base, f;
Mat pow(Mat a, int b) {
  Mat ans, tmp = a;
  for (int i = 1; i <= m; i++) ans.a[i][i] = 0;
  while (b) {
    if (b & 1) ans = ans * tmp;
    tmp = tmp * tmp;
    b >>= 1;
  }
  return ans;
}
int state[266], ls, who[73];
struct Ran {
  int l, r;
} qq[33], ran[33];
int len;
long long g[73], h[73];
int cost[12];
struct Block {
  int pos, w;
} ww[33];
bool cmpww(const Block &a, const Block &b) { return a.pos < b.pos; }
struct Hash {
  int first[107], le;
  struct Edge {
    int to, v, next;
  } edge[33];
  Hash() { le = 2; }
  void insert(int x, int y) {
    int h = x % 107;
    Edge &e = edge[le];
    e.to = x;
    e.v = y;
    e.next = first[h];
    first[h] = le++;
  }
  int find(int x) {
    int h = x % 107;
    for (int i = first[h]; i; i = edge[i].next)
      if (edge[i].to == x) return edge[i].v;
    return -2e9;
  }
} ha;
int main() {
  scanf("%d%d%d%d", &X, &K, &n, &q);
  for (int i = 1; i <= K; i++) scanf("%d", &cost[i]);
  for (int i = 1; i <= q; i++) scanf("%d%d", &ww[i].pos, &ww[i].w);
  sort(ww + 1, ww + 1 + q, cmpww);
  long long ans = 0;
  for (int &i = q; i; i--)
    if (ww[i].pos >= n - X + 1)
      ans += ww[i].w;
    else
      break;
  for (int i = 1; i <= q; i++) ha.insert(ww[i].pos, ww[i].w);
  for (int i = 1; i <= q; i++)
    qq[i].l = max(ww[i].pos - K, 2), qq[i].r = ww[i].pos;
  len = 0;
  for (int i = 1; i <= q; i++) {
    if (len && qq[i].l <= ran[len].r + 1)
      ran[len].r = qq[i].r;
    else
      len++, ran[len].l = qq[i].l, ran[len].r = qq[i].r;
  }
  ls = 0;
  for (int i = 1; i < (1 << K); i++) {
    int cnt = 0;
    for (int j = 0; j < K; j++)
      if ((i >> j) & 1) cnt++;
    if (cnt == X) ls++, state[i] = ls, who[ls] = i;
  }
  m = ls;
  for (int i = 1; i <= ls; i++) {
    int s = who[i] >> 1;
    if ((who[i] & 1) == 0)
      base.a[i][state[s]] = 0;
    else
      for (int j = 1; j <= K; j++)
        if (((s >> (j - 1)) & 1) == 0)
          base.a[i][state[s | (1 << (j - 1))]] = cost[j];
  }
  f.a[1][1] = 0;
  ran[0].r = 1;
  for (int i = 1; i <= len; i++) {
    f = f * pow(base, ran[i].l - ran[i - 1].r - 1);
    for (int j = 1; j <= ls; j++) g[j] = f.a[1][j];
    for (int j = ran[i].l; j <= ran[i].r; j++) {
      for (int k = 1; k <= ls; k++) h[k] = inf;
      for (int k = 1; k <= ls; k++) {
        int s = who[k] >> 1;
        if ((who[k] & 1) == 0)
          h[state[s]] = min(h[state[s]], g[k]);
        else
          for (int l = 1, tmp; l <= K; l++)
            if (((s >> (l - 1)) & 1) == 0) {
              int ns = s | (1 << (l - 1));
              if ((tmp = ha.find(j + l - 1)) != -2e9)
                h[state[ns]] = min(h[state[ns]], g[k] + cost[l] + tmp);
              else
                h[state[ns]] = min(h[state[ns]], g[k] + cost[l]);
            }
      }
      for (int k = 1; k <= ls; k++) g[k] = h[k];
    }
    for (int j = 1; j <= ls; j++) f.a[1][j] = g[j];
  }
  f = f * pow(base, n - X + 1 - ran[len].r);
  printf("%lld\n", ans + f.a[1][1]);
  return 0;
}
