#include <bits/stdc++.h>
using namespace std;
struct __timestamper {};
const int MAXID = 8 * 7 * 6 * 5 / 4 / 3 / 2 / 1;
const int MAXM = 1 << 8;
const long long INFLL = 1e18;
struct DistMat {
  long long d[MAXID][MAXID];
  DistMat(long long v = INFLL) {
    for (int i = 0; i < (MAXID); i++)
      for (int j = 0; j < (MAXID); j++) d[i][j] = INFLL;
    for (int i = 0; i < (MAXID); i++) d[i][i] = v;
  }
};
DistMat operator+(const DistMat &a, const DistMat &b) {
  DistMat res;
  for (int i = 0; i < (MAXID); i++)
    for (int j = 0; j < (MAXID); j++)
      for (int k = 0; k < (MAXID); k++)
        res.d[i][j] = min(res.d[i][j], a.d[i][k] + b.d[k][j]);
  return res;
}
int x, k, idcnt;
int id2msk[MAXID];
int msk2id[MAXM];
DistMat construct(const vector<int> &jumps) {
  assert(((int)(jumps).size()) == k);
  DistMat res;
  for (int id = 0; id < (idcnt); id++) {
    int m = id2msk[id];
    if (!(m & 1)) {
      int nm = m >> 1;
      int id2 = msk2id[nm];
      assert(0 <= id2 && id2 < idcnt);
      res.d[id][id2] = 0;
      continue;
    }
    for (int jmp = 0; jmp < (k); jmp++) {
      int nm = m >> 1;
      if (nm & (1 << jmp)) continue;
      nm |= 1 << jmp;
      int id2 = msk2id[nm];
      assert(0 <= id2 && id2 < idcnt);
      res.d[id][id2] = min(res.d[id][id2], (long long)jumps[jmp]);
    }
  }
  return res;
}
int main() {
  int n, q;
  while (scanf("%d%d%d%d", &x, &k, &n, &q) == 4) {
    memset(id2msk, -1, sizeof id2msk);
    memset(msk2id, -1, sizeof msk2id);
    idcnt = 0;
    for (int m = 0; m < (1 << k); m++)
      if (__builtin_popcount(m) == x) {
        id2msk[idcnt] = m;
        msk2id[m] = idcnt;
        idcnt++;
      }
    assert(idcnt <= MAXID);
    vector<int> cs(k);
    for (int &c : cs) scanf("%d", &c);
    vector<int> evs = {0, n - x};
    vector<pair<int, int> > specs(q);
    for (pair<int, int> &s : specs) {
      scanf("%d%d", &s.first, &s.second), s.first--;
      for (int i = 0; i <= k; i++) {
        int p = s.first - i;
        p = max(p, 0);
        p = min(p, n - x);
        evs.emplace_back(p);
      }
    }
    sort(evs.begin(), evs.end());
    evs.erase(unique(evs.begin(), evs.end()), evs.end());
    vector<DistMat> bases = {construct(cs)};
    for (int i = 1; i <= 27; i++)
      bases.emplace_back(bases.back() + bases.back());
    DistMat cur = 0;
    for (int eid = 0; eid + 1 < ((int)(evs).size()); eid++) {
      int i = evs[eid], ni = evs[eid + 1];
      vector<int> jumps = cs;
      for (pair<int, int> s : specs)
        if (i < s.first && s.first <= i + k) {
          jumps[s.first - i - 1] += s.second;
        }
      if (jumps != cs) {
        DistMat cm = construct(jumps);
        assert(i + 1 == ni);
        cur = cur + cm;
      } else {
        int diff = ni - i;
        for (int id = 0; id < (((int)(bases).size())); id++)
          if (diff & (1 << id)) cur = cur + bases[id];
      }
    }
    int sid = msk2id[(1 << x) - 1];
    assert(0 <= sid && sid < idcnt);
    printf(
        "%lld"
        "\n",
        cur.d[sid][sid]);
  }
  return 0;
}
