#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int MAXN = 100 * 1000 + 10, MAXT = 1000 * 1000 * 1000;
const long long oo = 1LL << 60;
int n, m, P;
int pos[MAXN];
long long S[MAXN], pref[MAXN];
long long dp[2][MAXN];
auto f = [](const pair<long long, long long> &L, const long long &x) {
  return L.first * x + L.second;
};
double g(pair<long long, long long> a, pair<long long, long long> b) {
  assert(a.first > b.first);
  return (b.second - a.second + 0.0) / (a.first - b.first);
}
void insert(pair<long long, long long> L,
            deque<pair<long long, long long> > &dq) {
  while (((int)dq.size()) > 1) {
    int s = ((int)dq.size());
    pair<long long, long long> a = dq[s - 2], b = dq[s - 1];
    if (g(a, L) <= g(a, b))
      dq.pop_back();
    else
      break;
  }
  dq.push_back(L);
}
long long query(long long x, deque<pair<long long, long long> > &dq) {
  while (((int)dq.size()) > 1 && f(dq[0], x) >= f(dq[1], x)) dq.pop_front();
  return f(dq[0], x);
}
int main(int argc, char **argv) {
  scanf("%d %d %d", &n, &m, &P);
  for (int i = 2; i <= n; i++) {
    int d;
    scanf("%d", &d);
    pos[i] = pos[i - 1] + d;
  }
  long long mn = INT_MAX, mx = INT_MIN;
  for (int i = 1; i <= m; i++) {
    int h, t;
    scanf("%d %d", &h, &t);
    S[i] = t - pos[h];
    mn = min(mn, S[i]);
    mx = max(mx, S[i]);
  }
  sort(S + 1, S + m + 1);
  for (int i = 1; i <= m; i++) pref[i] = pref[i - 1] + S[i];
  for (int i = 0; i <= m; i++) dp[0][i] = (i != 0) * oo;
  int cur = 0, prv = 1;
  deque<pair<long long, long long> > dq;
  for (int p = 1; p <= P; p++) {
    swap(cur, prv);
    dq.clear();
    insert(pair<long long, long long>(0, 0), dq);
    for (int r = 1; r <= m; r++) {
      dp[cur][r] = query(S[r], dq) + S[r] * r - pref[r];
      pair<long long, long long> L(-r, dp[prv][r] + pref[r]);
      insert(L, dq);
    }
  }
  cout << dp[cur][m] << endl;
  return 0;
}
