#include <bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
void read(int &x) {
  char ch;
  bool ok;
  for (ok = 0, ch = getchar(); !(ch >= '0' && ch <= '9'); ch = getchar())
    if (ch == '-') ok = 1;
  for (x = 0; (ch >= '0' && ch <= '9'); x = x * 10 + ch - '0', ch = getchar())
    ;
  if (ok) x = -x;
}
void read(long long &x) {
  char ch;
  bool ok;
  for (ok = 0, ch = getchar(); !(ch >= '0' && ch <= '9'); ch = getchar())
    if (ch == '-') ok = 1;
  for (x = 0; (ch >= '0' && ch <= '9'); x = x * 10 + ch - '0', ch = getchar())
    ;
  if (ok) x = -x;
}
int read() {
  int x;
  read(x);
  return x;
}
void write(long long x) {
  if (x < 0) putchar('-'), x = -x;
  char ch[50];
  int i;
  if (x == 0) return puts("0"), void();
  for (i = 0; x; i++) ch[i] = x % 10 + '0', x /= 10;
  for (--i; i >= 0; i--) putchar(ch[i]);
  puts("");
}
long long sum[100005], f[2][100005], x, y, A[100005], ans = 1e18, now, last;
int q[100005], head, tail, d[100005], n, m, p;
int slope(int a, int b) {
  return (f[last][a] + sum[a] - f[last][b] - sum[b]) / (a - b);
}
struct point {
  int x, y;
} s[100005];
int main() {
  read(n), read(m), read(p);
  for (int i = 2; i <= n; i++) read(d[i]), d[i] += d[i - 1];
  for (int i = 1; i <= m; i++) read(x), read(A[i]), A[i] -= d[x];
  sort(A + 1, A + m + 1);
  for (int i = 1; i <= m; i++) sum[i] = sum[i - 1] + A[i];
  now = 1, last = 0;
  for (int i = 1; i <= m + 1; i++) f[last][i] = 0x3f3f3f3f3f3f3f3fll;
  for (int i = 1; i <= p; i++) {
    q[head = tail = 0] = 0;
    for (int j = 1; j <= m; j++) {
      int k = A[j];
      while (head < tail && slope(q[head + 1], q[head]) <= k) head++;
      f[now][j] = min(f[last][j], f[last][q[head]] + A[j] * (j - q[head]) -
                                      (sum[j] - sum[q[head]]));
      if (f[last][j] >= 0x3f3f3f3f3f3f3f3fll) continue;
      while (head < tail && slope(q[tail], q[tail - 1]) > slope(j, q[tail]))
        tail--;
      q[++tail] = j;
    }
    ans = min(ans, f[now][m]);
    swap(now, last);
  }
  write(ans);
  return 0;
}
