#include <bits/stdc++.h>
using namespace std;
const long long sz = 1e5 + 10;
long long pre[sz], preTim[sz], dp[2][sz];
int t2[sz], pnt[sz], d[sz];
struct Line {
  int m;
  long long c;
} tree[sz];
int exist[sz], state;
inline long long f(Line &line, int &x) {
  return (long long)line.m * x + line.c;
}
void add(int lo, int hi, Line line) {
  int mid, lpnt, mpnt;
  while (lo <= hi) {
    mid = lo + hi >> 1, lpnt = pnt[lo], mpnt = pnt[mid];
    if (exist[mid] != state) tree[mid] = {0, (1LL << 62)};
    exist[mid] = state;
    bool l = f(line, lpnt) < f(tree[mid], lpnt);
    bool m = f(line, mpnt) < f(tree[mid], mpnt);
    if (m) swap(tree[mid], line);
    if (l != m)
      hi = mid - 1;
    else
      lo = mid + 1;
  }
}
long long query(int lo, int hi, int &idx) {
  long long ret = (1LL << 62);
  int mid, p = pnt[idx];
  while (lo <= hi) {
    mid = lo + hi >> 1;
    if (exist[mid] != state) break;
    ret = min(ret, f(tree[mid], p));
    if (idx < mid)
      hi = mid - 1;
    else if (idx > mid)
      lo = mid + 1;
    else
      break;
  }
  return ret;
}
int main() {
  long long n, m, p;
  cin >> n >> m >> p;
  for (long long i = 2; i <= n; i++) {
    scanf("%d", &d[i]);
    pre[i] = pre[i - 1] + d[i];
  }
  for (long long i = 1; i <= m; ++i) {
    int h, t;
    scanf("%d", &h), scanf("%d", &t);
    t2[i] = t - pre[h];
  }
  sort(t2 + 1, t2 + m + 1);
  bool now = 0;
  for (long long i = 1; i <= m; ++i) {
    preTim[i] = preTim[i - 1] + t2[i];
    dp[now][i] = i * t2[i] - preTim[i];
    pnt[i] = t2[i];
  }
  for (int i = 2; i <= p; i++) {
    now ^= 1, state++;
    add(1, m, {0, 0});
    for (int j = 1; j <= m; j++) {
      dp[now][j] = query(1, m, j) + (long long)j * t2[j] - preTim[j];
      add(1, m, {-j, preTim[j] + dp[now ^ 1][j]});
    }
  }
  cout << dp[now][m] << '\n';
  return 0;
}
