#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <typename T>
void debug(T first) {
  cout << first << "\n";
}
template <typename T, typename... Args>
void debug(T first, Args... args) {
  cout << first << " ";
  debug(args...);
}
long long read_ll() {
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  long long ret = 0;
  int neg = 0;
  if (c == '-') neg = 1, c = getchar();
  while (c >= '0' && c <= '9') {
    ret = 10 * ret + c - 48;
    c = getchar();
  }
  return neg ? -ret : ret;
}
const int INF = INT_MAX;
int main() {
  int a, n, m;
  cin >> a >> n >> m;
  long long rain[a + 2], dp[a + 2], umb[a + 2];
  memset(rain, 0, sizeof(rain));
  memset(umb, 0, sizeof(umb));
  for (int i = 1; i <= n; i++) {
    int l, r;
    cin >> l >> r;
    for (int j = l; j <= r - 1; j++) rain[j] = 1;
  }
  vector<int> location;
  for (int i = 1; i <= m; i++) {
    long long loc, w;
    cin >> loc >> w;
    if (umb[loc] == 0)
      umb[loc] = w;
    else
      umb[loc] = min(umb[loc], w);
  }
  memset(dp, 0, sizeof(dp));
  for (int i = 1; i <= a + 1; i++) {
    dp[i] = INF;
    if (rain[i - 1]) {
      for (int j = 0; j <= i - 1; j++) {
        if (umb[j] == 0) continue;
        dp[i] = min(dp[j] + (i - j) * umb[j], dp[i]);
      }
    } else {
      dp[i] = dp[i - 1];
    }
  }
  long long ans = ((dp[a] == INF) ? -1 : dp[a]);
  cout << ans << '\n';
  return 0;
}
