#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000;
const int MAXM = 100000;
const int MAXP = 100;
const long long oops = 1e18;
class Line {
 public:
  double x;
  int j;
  long long C, M;
  Line() {}
  Line(double x, int j, long long C, long long M) : x(x), j(j), C(C), M(M) {}
};
vector<Line> lines;
long long best[MAXP + 5][MAXN + 5];
int n, m, P;
int D[MAXN + 5];
long long dist[MAXN + 5];
long long vals[MAXM + 5];
long long sums[MAXM + 5];
double x_intersect(long long c1, long long m1, long long c2, long long m2) {
  if (m1 == m2) {
    printf("Hobbba\n");
    if (c1 < c2) return oops;
    return -oops;
  }
  return ((double)c1 - c2) / ((double)m2 - m1);
}
void addLine(long long C, long long M, int j) {
  Line line(-oops, j, C, M);
  if (lines.size() == 0)
    lines.push_back(line);
  else {
    if (lines.back().M == M && lines.back().C < C) return;
    while (lines.size() > 1 &&
           (lines.back().M == M ||
            ((double)lines.back().M - M) *
                    (lines[lines.size() - 2].C - lines.back().C) >
                ((double)lines.back().M - lines[lines.size() - 2].M) *
                    (C - lines.back().C))) {
      lines.pop_back();
      lines.back().x = -oops;
    }
    lines.back().x = x_intersect(C, M, lines.back().C, lines.back().M);
    lines.push_back(line);
  }
  return;
}
int getJ(double x) {
  int s = 0, e = lines.size() - 1;
  int ret = -1;
  while (s <= e) {
    int mid = (s + e) >> 1;
    if (x >= lines[mid].x) {
      ret = lines[mid].j;
      e = mid - 1;
    } else
      s = mid + 1;
  }
  return ret;
}
int main() {
  int c, c2;
  scanf("%d%d%d", &n, &m, &P);
  dist[0] = 0;
  for (c = 1; c < n; c++) {
    scanf("%d", &D[c - 1]);
    dist[c] = dist[c - 1] + D[c - 1];
  }
  for (c = 0; c < m; c++) {
    int h, t;
    scanf("%d%d", &h, &t);
    vals[c] = t - dist[h - 1];
  }
  sort(vals, vals + m);
  sums[0] = 0;
  for (c = 0; c < m; c++) sums[c + 1] = sums[c] + vals[c];
  for (c = 0; c < m; c++) best[0][c] = oops;
  best[0][m] = 0;
  for (int p = 1; p <= P; p++) {
    best[p][m] = 0;
    lines.clear();
    for (int i = m - 1; i >= 0; i--) {
      addLine(i * vals[i] - sums[i] + best[p - 1][i + 1], -vals[i], i);
      int j = getJ(i);
      best[p][i] =
          sums[i] + j * vals[j] - sums[j] + best[p - 1][j + 1] - i * vals[j];
    }
  }
  printf("%I64d\n", best[P][0]);
  return 0;
}
