#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool Up(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool Down(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
inline int getus() {
  int tmp, c;
  while (tmp = fgetc(stdin), tmp < '0' || tmp > '9')
    ;
  tmp -= '0';
  while (c = fgetc(stdin), '0' <= c && c <= '9') tmp = tmp * 10 + c - '0';
  return tmp;
}
inline int getint() {
  int tmp, c, flag;
  while (flag = fgetc(stdin), flag != '-' && (flag < '0' || flag > '9'))
    ;
  if (flag == '-')
    tmp = 0;
  else
    tmp = flag - '0';
  while (c = fgetc(stdin), '0' <= c && c <= '9') tmp = tmp * 10 + c - '0';
  return flag == '-' ? -tmp : tmp;
}
int N, M, feeder, P[100023], V[100023];
long long opt[2][100023], Sum[100023];
long long ans = LLONG_MAX;
pair<int, long long> C[100023];
int tot, ptr;
inline void insert(pair<int, long long> c) {
  while (tot > 1 &&
         double(C[tot - 1].second - C[tot].second) /
                 (C[tot - 1].first - C[tot].first) >=
             double(C[tot].second - c.second) / (C[tot].first - c.first))
    --tot;
  if (tot < ptr) ptr = tot;
  C[++tot] = c;
}
inline void fix(long long V) {
  assert(tot);
  if (ptr == 0) ++ptr;
  assert(ptr <= tot);
  while (ptr < tot && C[ptr].second - C[ptr].first * V >=
                          C[ptr + 1].second - C[ptr + 1].first * V)
    ++ptr;
}
int main() {
  scanf("%d %d %d", &N, &M, &feeder);
  P[0] = P[1] = 0;
  for (int i = (2); i <= (N); ++i) {
    scanf("%d", P + i);
    P[i] += P[i - 1];
  }
  for (int i = (1); i <= (M); ++i) {
    int h, t;
    scanf("%d %d", &h, &t);
    V[i] = t - P[h];
  }
  sort(V + 1, V + M + 1);
  Sum[0] = 0;
  for (int i = (1); i <= (M); ++i) Sum[i] = Sum[i - 1] + V[i];
  long long *opt_now = opt[0], *opt_last = opt[1];
  for (int i = (0); i <= (1); ++i)
    for (int j = (0); j <= (M); ++j) opt[i][j] = 4000000000000000000ll;
  opt_last[0] = 0;
  for (int j = (1); j <= (feeder); ++j) {
    for (int i = (0); i <= (M); ++i) opt_now[i] = 4000000000000000000ll;
    opt_now[0] = 0;
    tot = ptr = 0;
    insert(pair<int, long long>(0, (opt_last[0] + Sum[0])));
    for (int i = (1); i <= (M); ++i) {
      fix(V[i]);
      opt_now[i] = C[ptr].second - (long long)C[ptr].first * V[i] +
                   (long long)i * V[i] - Sum[i];
      if (opt_last[i] < 4000000000000000000ll)
        insert(pair<int, long long>(i, (opt_last[i] + Sum[i])));
    }
    Down(ans, opt_now[M]);
    swap(opt_now, opt_last);
  }
  cout << ans << endl;
  return 0;
}
