#include <bits/stdc++.h>
using namespace std;
bool check(long long n, long long pos) { return n & (1LL << pos); }
long long Set(long long n, long long pos) { return n = n | (1LL << pos); }
struct line {
  long long m, c;
  line(long long x, long long y) {
    m = x;
    c = y;
  }
};
long long arr[100005];
struct CHT {
  vector<line> vec;
  long long t, ptr;
  void init(long long x) {
    t = x;
    ptr = 0;
    vec.clear();
  }
  inline long long func(long long idx, long long x) {
    long long ret = vec[idx].m * x + vec[idx].c;
    return ret;
  }
  bool bad(line f1, line f2, line f3) {
    __int128 a = (f3.c - f1.c);
    a = a * (f1.m - f2.m);
    __int128 b = (f2.c - f1.c);
    b = b * (f1.m - f3.m);
    if (t == 1) return a <= b;
    if (t == 2) return a >= b;
    if (t == 3) return a >= b;
    if (t == 4) return a <= b;
    assert(0);
  }
  void add(line x) {
    long long sz = vec.size();
    while (sz >= 2 && bad(vec[sz - 2], vec[sz - 1], x)) {
      vec.pop_back();
      sz--;
    }
    vec.push_back(x);
  }
  long long ask(long long x) {
    if (vec.empty()) {
      return 0;
    }
    long long lo = 0;
    long long hi = vec.size() - 1;
    long long ret = (t & 1) ? LLONG_MAX : -LLONG_MAX;
    while (lo <= hi) {
      long long mid1 = (lo + (hi - lo) / 3);
      long long mid2 = (hi - (hi - lo) / 3);
      long long ans1 = func(mid1, x);
      long long ans2 = func(mid2, x);
      if (ans1 > ans2) {
        if (t & 1) {
          ret = min(ret, ans2);
          lo = mid1 + 1;
        } else {
          ret = max(ret, ans1);
          hi = mid2 - 1;
        }
      } else {
        if (t & 1) {
          ret = min(ret, ans1);
          hi = mid2 - 1;
        } else {
          ret = max(ret, ans2);
          lo = mid1 + 1;
        }
      }
    }
    return ret;
  }
  long long ask1(long long x) {
    if (vec.empty()) {
      return 0;
    }
    if (ptr >= vec.size()) ptr = vec.size() - 1;
    while (ptr < (vec.size() - 1)) {
      if (t & 1) {
        if (func(ptr, x) > func(ptr + 1, x)) {
          ptr++;
        } else
          break;
      } else {
        if (func(ptr, x) < func(ptr + 1, x)) {
          ptr++;
        } else
          break;
      }
    }
    return func(ptr, x);
  }
};
long long dd[100005];
long long hh[100005];
long long tt[100005];
long long px[100005];
long long dp[101][100005];
int main() {
  long long i, j, k, l, m, n, o, r, q;
  long long testcase;
  long long input, flag, tag, ans;
  while (cin >> n >> m >> k) {
    dd[1] = 0;
    for (long long i = 2; i <= n; i++)
      scanf("%lld", &dd[i]), dd[i] += dd[i - 1];
    for (long long i = 1; i <= m; i++) {
      scanf("%lld", &hh[i]);
      scanf("%lld", &tt[i]);
      arr[i] = tt[i] - dd[hh[i]];
    }
    sort(arr + 1, arr + 1 + m);
    for (long long i = 1; i <= m; i++) {
      px[i] = px[i - 1] + arr[i];
    }
    for (long long i = 1; i <= m; i++) {
      dp[1][i] = i * arr[i] - px[i];
    }
    CHT cht;
    for (long long i = 2; i <= k; i++) {
      cht.init(1);
      cht.add({0, 0});
      long long mx = -LLONG_MAX;
      for (long long j = 1; j <= m; j++) {
        mx = max(mx, arr[j]);
        dp[i][j] = cht.ask(mx) + (j * mx) - px[j];
        cht.add({-j, dp[i - 1][j] + px[j]});
      }
    }
    printf("%lld\n", dp[k][m]);
  }
}
