#include <bits/stdc++.h>
using namespace std;
typedef struct line {
  long long c, m;
} Line;
long long hills[200005];
int N, M, P;
long long X[200005];
long long dp[2][200005];
long long SX[200005];
long long C[200005];
int front, rear;
Line stack1[100001];
bool crossLeft(Line A, Line B, Line C) {
  long double xAB = (A.c - B.c) / (A.m - B.m);
  long double xBC = (B.c - C.c) / (B.m - C.m);
  return xAB > xBC;
}
long long Calc(Line A, long long x) { return -A.m * x + A.c; }
void AddLine(long long m, long long c) {
  Line line = {c, m};
  if (front < rear && stack1[rear - 1].m == line.m) {
    stack1[rear - 1].c = max(stack1[rear - 1].c, line.c);
    return;
  }
  while (rear - front >= 2 &&
         crossLeft(stack1[rear - 2], stack1[rear - 1], line))
    rear--;
  stack1[rear++] = line;
}
long long GetMin(long long x) {
  while (rear - front >= 2 &&
         Calc(stack1[front], x) > Calc(stack1[front + 1], x))
    front++;
  return Calc(stack1[front], x);
}
void ConvexHullTrick() {
  for (int i = 1; i <= M; i++) SX[i] = X[i] + SX[i - 1];
  for (int i = 1; i <= M; i++) {
    dp[0][i] = i * X[i] - SX[i];
  }
  int now = 1;
  int pre = 0;
  long long ans = dp[0][M];
  for (int i = 2; i <= P; i++) {
    for (int j = 1; j <= M; j++) {
      C[j] = dp[pre][j] + SX[j];
    }
    dp[now][0] = 0;
    front = rear = 0;
    for (int j = 1; j <= M; j++) {
      AddLine(j - 1, C[j - 1]);
      dp[now][j] = GetMin(X[j]) - SX[j] + X[j] * j;
    }
    ans = min(ans, dp[now][M]);
    now ^= 1;
    pre ^= 1;
  }
  cout << ans << endl;
}
void solve() { ConvexHullTrick(); }
int main() {
  scanf("%d %d %d", &N, &M, &P);
  for (int i = 2; i <= N; i++) {
    scanf("%d", &hills[i]);
    hills[i] += hills[i - 1];
  }
  int h, t;
  for (int i = 1; i <= M; i++) {
    scanf("%d %d", &h, &t);
    X[i] = t - hills[h];
  }
  sort(X + 1, X + M + 1);
  solve();
  return 0;
}
