#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 30;
const double EPS = 1e-7;
const int MAXN = 100010;
const int MAXM = 100010;
const int MAXP = 110;
struct line {
  long long m, n;
  line() {}
  line(long long _m, long long _n) : m(_m), n(_n) {}
  long long eval(long long x) { return m * x + n; }
};
line q[MAXN];
int head, tail;
long long d[MAXN];
long long dp[MAXM][MAXP];
long long W[MAXN];
long long S[MAXM];
int N, M, P;
bool bad(line a, line b, line c) {
  return (a.n - b.n) * (c.m - b.m) >= (b.n - c.n) * (b.m - a.m);
}
void insert(line c) {
  while (tail - head >= 2 && bad(q[tail - 2], q[tail - 1], c)) tail--;
  q[tail++] = c;
}
long long query(long long x) {
  while (tail - head >= 2 && q[head].eval(x) > q[head + 1].eval(x)) head++;
  return q[head].eval(x);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> N >> M >> P;
  d[0] = 0;
  for (int i = 1; i < N; i++) {
    cin >> d[i];
    d[i] += d[i - 1];
  }
  for (int i = 1; i <= M; i++) {
    int h, t;
    cin >> h >> t;
    W[i] = t - d[h - 1];
  }
  sort(W + 1, W + M + 1);
  for (int i = 1; i <= M; i++) S[i] = S[i - 1] + W[i];
  for (int i = 1; i <= M; i++) dp[i][1] = -S[i] + i * W[i];
  for (int k = 2; k <= P; k++) {
    head = tail = 0;
    insert(line(0, 0));
    for (int i = 1; i <= M; i++) {
      dp[i][k] = query(W[i]) + i * W[i] - S[i];
      insert(line(-i, S[i] + dp[i][k - 1]));
    }
  }
  cout << dp[M][P] << endl;
  return 0;
}
