#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1e5 + 5, MAXM = 105, lof = 2e18;
long long n, m, p, a[MAXN], H[MAXN], T[MAXN], pret[MAXN], pre[MAXN];
struct Node {
  long long A, B;
  bool operator<(const Node P) const { return B < P.B; }
} arr[MAXN];
long long dp[MAXM][MAXN];
long long que[MAXN], head = 1, tail = 1;
long long Calc(long long x, long long y) { return dp[x - 1][y] + pret[y]; }
signed main() {
  scanf("%lld%lld%lld", &n, &m, &p);
  for (long long i = 1; i < n; i++)
    scanf("%lld", &a[i]), pre[i] = pre[i - 1] + a[i];
  for (long long i = 1; i <= m; i++)
    scanf("%lld%lld", &H[i], &T[i]), T[i] -= pre[H[i] - 1], arr[i].A = H[i],
                                                            arr[i].B = T[i];
  sort(arr + 1, arr + 1 + m);
  for (long long i = 1; i <= m; i++)
    H[i] = arr[i].A, T[i] = arr[i].B, pret[i] = pret[i - 1] + T[i];
  for (long long i = 1; i <= m; i++) dp[0][i] = lof;
  for (long long i = 1; i <= p; i++) {
    head = 1;
    tail = 1;
    for (long long j = 1; j <= m; j++) {
      while (head < tail &&
             (Calc(i, j) - Calc(i, que[tail])) * (que[tail] - que[tail - 1]) <=
                 (Calc(i, que[tail]) - Calc(i, que[tail - 1])) *
                     (j - que[tail]))
        tail--;
      que[++tail] = j;
      while (head < tail && Calc(i, que[head + 1]) - Calc(i, que[head]) <=
                                T[j] * (que[head + 1] - que[head]))
        head++;
      dp[i][j] = dp[i - 1][que[head]] - T[j] * que[head] + pret[que[head]] +
                 T[j] * j - pret[j];
    }
  }
  printf("%lld", dp[p][m]);
  return 0;
}
