#include <bits/stdc++.h>
using namespace std;
pair<int, int> tree[600005], cmpp = {0, 0};
pair<int, int> lazy[600005];
void updateRangeUtil(int si, int ss, int se, int us, int ue,
                     pair<int, int> diff) {
  if (lazy[si] != cmpp) {
    tree[si] = max(tree[si], lazy[si]);
    if (ss != se) {
      lazy[si * 2 + 1] = max(lazy[si], lazy[si * 2 + 1]);
      lazy[si * 2 + 2] = max(lazy[si], lazy[si * 2 + 2]);
    }
    lazy[si] = {0, 0};
  }
  if (ss > se || ss > ue || se < us) return;
  if (ss >= us && se <= ue) {
    tree[si] = max(diff, tree[si]);
    if (ss != se) {
      lazy[si * 2 + 1] = max(lazy[si * 2 + 1], diff);
      lazy[si * 2 + 2] = max(lazy[si * 2 + 2], diff);
    }
    return;
  }
  int mid = (ss + se) / 2;
  updateRangeUtil(si * 2 + 1, ss, mid, us, ue, diff);
  updateRangeUtil(si * 2 + 2, mid + 1, se, us, ue, diff);
  tree[si] = max(tree[si * 2 + 1], tree[si * 2 + 2]);
}
void updateRange(int n, int us, int ue, pair<int, int> diff) {
  updateRangeUtil(0, 0, n - 1, us, ue, diff);
}
pair<int, int> getSumUtil(int ss, int se, int qs, int qe, int si) {
  if (lazy[si] != cmpp) {
    tree[si] = max(tree[si], lazy[si]);
    if (ss != se) {
      lazy[si * 2 + 1] = max(lazy[si], lazy[si * 2 + 1]);
      lazy[si * 2 + 2] = max(lazy[si], lazy[si * 2 + 2]);
    }
    lazy[si] = {0, 0};
  }
  if (ss > se || ss > qe || se < qs) return cmpp;
  if (ss >= qs && se <= qe) return tree[si];
  int mid = (ss + se) / 2;
  return max(getSumUtil(ss, mid, qs, qe, 2 * si + 1),
             getSumUtil(mid + 1, se, qs, qe, 2 * si + 2));
}
pair<int, int> getSum(int n, int qs, int qe) {
  if (qs < 0 || qe > n - 1 || qs > qe) {
    printf("Invalid Input");
    return cmpp;
  }
  return getSumUtil(0, n - 1, qs, qe, 0);
}
pair<int, int> vals[100003];
long long int dp[100002][201];
int n, m, k;
long long int calc(int tim, int rem) {
  if (tim >= n) return 0;
  long long int& ans = dp[tim][rem];
  if (ans != -1) return ans;
  if (vals[tim].first == 0) {
    return calc(tim + 1, rem);
  }
  ans = vals[tim].first + calc(vals[tim].second, rem);
  if (rem > 0) ans = min(ans, calc(tim + 1, rem - 1));
  return ans;
}
void solve() {
  cin >> n >> m >> k;
  for (int i = 0; i < k; i++) {
    int s, t, d, w;
    cin >> s >> t >> d >> w;
    updateRange(n, s - 1, t - 1, {w, d});
  }
  for (int i = 0; i < n; i++) {
    vals[i] = getSum(n, i, i);
  }
  for (int pos = n - 1; pos >= 0; pos--) {
    for (int i = 0; i <= m; i++) {
      long long int& ans = dp[pos][i];
      if (vals[pos].first == 0) {
        ans = dp[pos + 1][i];
        continue;
      }
      ans = vals[pos].first + dp[vals[pos].second][i];
      if (i > 0) ans = min(ans, dp[pos + 1][i - 1]);
    }
  }
  cout << dp[0][m];
}
signed main() {
  ios_base::sync_with_stdio(false);
  int t = 1;
  while (t--) solve();
  return 0;
}
