#include <bits/stdc++.h>
using namespace std;
template <class T>
bool umin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
long long dis[100009], arr[100009], par[100009];
long long dp[100009][103];
struct CHT {
  vector<long long> m, b;
  int point;
  void init() {
    point = 0;
    m.resize(0);
    b.resize(0);
  }
  long long intersect(int l1, int l2, int l3) {
    long long x1 = (b[l2] - b[l1]) / (m[l1] - m[l2]);
    long long x2 = (b[l3] - b[l1]) / (m[l1] - m[l3]);
    if (x1 < x2) return 0;
    return 1;
  }
  void upd(long long x, long long y) {
    m.push_back(x);
    b.push_back(y);
    while (m.size() > 2 and
           intersect(m.size() - 3, m.size() - 2, m.size() - 1)) {
      m.erase(m.end() - 2);
      b.erase(b.end() - 2);
    }
  }
  long long tap(long long x) {
    if (point >= int(m.size())) point = m.size() - 1;
    while (point + 1 < int(m.size()) and
           arr[x] * (x + m[point]) + b[point] - par[x] >
               arr[x] * (x + m[point + 1]) + b[point + 1] - par[x])
      point++;
    return arr[x] * (x + m[point]) + b[point] - par[x];
  }
};
int main() {
  int n, m, p;
  scanf("%d%d%d", &n, &m, &p);
  for (int i = 2; i <= n; i++) {
    long long x;
    scanf("%lld", &x);
    dis[i] = dis[i - 1] + x;
  }
  for (int i = 0; i < 100009; i++)
    for (int j = 0; j < 101; j++) dp[i][j] = 1000000000000000;
  for (int i = 1; i <= m; i++) {
    long long x, y;
    scanf("%lld%lld", &x, &y);
    arr[i] = y - dis[x];
  }
  sort(arr + 1, arr + m + 1);
  for (int i = 1; i <= m; i++) par[i] = arr[i] + par[i - 1];
  dp[0][0] = 0;
  CHT T;
  for (int y = 1; y <= p; y++) {
    T.init();
    T.upd(0, dp[0][y - 1]);
    for (int x = 1; x <= m; x++) {
      dp[x][y] = T.tap(x);
      T.upd(-x, dp[x][y - 1] + par[x]);
    }
  }
  printf("%lld\n", dp[m][p]);
  return 0;
}
