#include <bits/stdc++.h>
using namespace std;
int i, i0, n, m, p, pre[100005], a[100005];
long long dp[105][100005];
deque<int> q;
long long cal(int pos, int now, int p) {
  return dp[p - 1][pos] + (long long)(now - pos) * a[now];
}
double cross(int pos, int now, int p) {
  return ((double)dp[p - 1][pos] - dp[p - 1][now]) / (pos - now);
}
int main() {
  scanf("%d %d %d", &n, &m, &p);
  for (i = 2; i <= n; i++) {
    int x;
    scanf("%d", &x);
    pre[i] = pre[i - 1] + x;
  }
  for (i = 1; i <= m; i++) {
    int x;
    scanf("%d %d", &x, &a[i]), a[i] -= pre[x];
  }
  for (i = 0; i <= p; i++)
    for (i0 = 0; i0 <= m; i0++) dp[i][i0] = (long long)INT_MAX * INT_MAX / 2;
  dp[0][0] = 0;
  sort(a + 1, a + 1 + m);
  long long sum = 0;
  for (i = 1; i <= m; i++) sum += a[i];
  for (i = 1; i <= p; i++) {
    while (!q.empty()) q.pop_front();
    q.push_back(0);
    for (i0 = 1; i0 <= m; i0++) {
      while (q.size() > 1) {
        int x = q.front();
        q.pop_front();
        int y = q.front();
        if (cal(x, i0, i) > cal(y, i0, i))
          continue;
        else {
          q.push_front(x);
          break;
        }
      }
      dp[i][i0] = min(dp[i - 1][i0], cal(q.front(), i0, i));
      while (q.size() > 1) {
        int x = q.back();
        q.pop_back();
        int y = q.back();
        if (cross(x, i0, i) < cross(y, i0, i))
          continue;
        else {
          q.push_back(x);
          break;
        }
      }
      q.push_back(i0);
    }
  }
  printf("%lld\n", dp[p][m] - sum);
  return 0;
}
