#include <bits/stdc++.h>
using namespace std;
struct DEBUG {
  string open = "[", close = "]", sep = ", ";
  string f(string s) { return s; }
  string f(char c) { return string(1, c); }
  string f(int x) { return to_string(x); }
  string f(long long x) { return to_string(x); }
  template <typename A, typename B>
  string f(pair<A, B> p) {
    return open + f(p.first) + sep + f(p.second) + close;
  }
  template <typename A>
  string f(A v) {
    string s = open;
    for (auto a : v) {
      if (s != open) {
        s += sep;
      }
      s += f(a);
    }
    s += close;
    return s;
  }
  void show() { cout << endl; }
  template <typename Head, typename... Tail>
  void show(Head H, Tail... T) {
    cout << " " << f(H);
    show(T...);
  }
};
const long long inf = (long long)1e18 + 5;
const long long mod = 1e9 + 7;
vector<long long> di = {0, 0, 1, -1, 1, -1, 1, -1};
vector<long long> dj = {1, -1, 0, 0, -1, -1, 1, 1};
long long ob(long long i, long long n) { return i < 0 || i >= n; }
long long tp(long long x) { return (1LL << x); }
long long roundup(long long a, long long b) {
  return a % b ? a / b + 1 : a / b;
}
template <typename A, typename B>
long long exist(A a, B b) {
  return a.find(b) != a.end();
}
vector<string> ssplit(string s) {
  vector<string> ans;
  stringstream ss;
  ss << s;
  while (ss >> s) ans.push_back(s);
  return ans;
}
void upmin(long long& x, long long v) { x = min(x, v); }
void upmax(long long& x, long long v) { x = max(x, v); }
struct INPUT {
  void f(string& s) {
    char buf[105];
    long long a = scanf("%100s", buf);
    a++;
    s = buf;
  }
  void f(long long& x) {
    long long a = scanf("%lld", &x);
    a++;
  }
  void f(int& x) {
    long long a = scanf("%d", &x);
    a++;
  }
  void read() {}
  template <typename Head, typename... Tail>
  void read(Head& H, Tail&... T) {
    f(H);
    read(T...);
  }
};
long long n, m, k;
vector<pair<long long, long long> > deals;
vector<long long> pre;
long long dp[2005];
long long get(long long ind) {
  if (ind == k) return 0;
  if (ind > k) return inf;
  if (dp[ind] != -1) return dp[ind];
  long long ans = inf;
  for (auto deal : deals) {
    long long cur =
        get(ind + deal.first) + pre[ind + deal.first] - pre[ind + deal.second];
    upmin(ans, cur);
  }
  dp[ind] = ans;
  return ans;
}
void solve() {
  memset(dp, -1, sizeof(dp));
  do {
    INPUT inp;
    inp.read(n, m, k);
  } while (false);
  vector<long long> A(n);
  for (long long i = 0; i < n; i++) do {
      INPUT inp;
      inp.read(A[i]);
    } while (false);
  sort(A.begin(), A.end());
  pre.resize(n + 1);
  for (long long i = 0; i < n; i++) pre[i + 1] = pre[i] + A[i];
  vector<long long> best(k + 1);
  for (long long i = 0; i < m; i++) {
    long long a, b;
    do {
      INPUT inp;
      inp.read(a, b);
    } while (false);
    if (a > k) continue;
    upmax(best[a], b);
  }
  for (long long i = 1; i < k + 1; i++) deals.push_back({i, best[i]});
  cout << get(0) << endl;
}
signed main() {
  long long t = 1;
  for (long long i = 0; i < t; i++) solve();
  return 0;
}
