#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int v, next;
} edge[2050];
int e, ft[2050];
int a, n, m;
bool rain[2050];
int x[2050], p[2050];
long long dp[2050][2050];
long long opt[2050];
int main() {
  int l, r;
  while (cin >> a >> n >> m) {
    e = 0;
    for (int i = 0; i <= a; i++) {
      rain[i] = false;
      for (int j = 0; j <= m; j++) dp[i][j] = (1ll << 60);
      ft[i] = -1;
    }
    for (int i = 0; i < n; i++) {
      scanf("%d%d", &l, &r);
      while (l < r) {
        rain[l++] = true;
      }
    }
    for (int i = 0; i < m; i++) {
      scanf("%d%d", x + i, p + i);
      edge[e].v = i;
      edge[e].next = ft[x[i]];
      ft[x[i]] = e++;
      if (x[i] == 0) dp[0][i] = 0;
    }
    dp[0][m] = 0;
    p[m] = 0;
    opt[0] = 0;
    for (int i = 0; i < a; i++) {
      for (int j = 0; j <= m; j++) {
        if (dp[i][j] >= (1ll << 60)) continue;
        if (j < m || !rain[i])
          dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + p[j]);
      }
      opt[i + 1] = (1ll << 60);
      for (int j = 0; j <= m; j++) opt[i + 1] = min(opt[i + 1], dp[i + 1][j]);
      for (int j = ft[i + 1]; j != -1; j = edge[j].next) {
        int idx = edge[j].v;
        dp[i + 1][idx] = min(dp[i + 1][idx], opt[i + 1]);
      }
      dp[i + 1][m] = min(dp[i + 1][m], opt[i + 1]);
    }
    long long ans = -1;
    if (opt[a] < (1ll << 60)) ans = opt[a];
    cout << ans << endl;
  }
  return 0;
}
