#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const long long inf64 = 0x3f3f3f3f3f3f3f3f;
int n, m, k;
struct T {
  int val, s, t, ed;
} a[maxn];
bool operator<(const T x, const T y) {
  return x.val == y.val ? x.ed < y.ed : x.val < y.val;
}
int ed[maxn];
long long val[maxn], dp[maxn][210];
struct Tree {
  int tr[maxn << 2], sum[maxn << 2], mul[maxn << 2];
  void pushup(int p) { tr[p] = tr[p << 1] + tr[p << 1 | 1]; }
  void build(int p, int l, int r) {
    sum[p] = 0;
    mul[p] = 1;
    if (l == r) return;
    int mid = (l + r) >> 1;
    build(p << 1, l, mid);
    build(p << 1 | 1, mid + 1, r);
    pushup(p);
  }
  void load(int p, int l, int r, int mulk, int sumk) {
    tr[p] = tr[p] * mulk + (r - l + 1) * sumk;
    sum[p] = sum[p] * mulk + sumk;
    mul[p] = mul[p] * mulk;
  }
  void pushdown(int p, int l, int r) {
    int mid = (l + r) >> 1;
    load(p << 1, l, mid, mul[p], sum[p]);
    load(p << 1 | 1, mid + 1, r, mul[p], sum[p]);
    mul[p] = 1;
    sum[p] = 0;
  }
  void update1(int nl, int nr, int l, int r, int p, int k) {
    if (nl <= l && nr >= r) {
      load(p, l, r, k, 0);
      return;
    }
    pushdown(p, l, r);
    int mid = (l + r) >> 1;
    if (nl <= mid) update1(nl, nr, l, mid, p << 1, k);
    if (nr >= mid + 1) update1(nl, nr, mid + 1, r, p << 1 | 1, k);
    pushup(p);
  }
  void update2(int nl, int nr, int l, int r, int p, int k) {
    if (nl <= l && nr >= r) {
      load(p, l, r, 1, k);
      return;
    }
    pushdown(p, l, r);
    int mid = (l + r) >> 1;
    if (nl <= mid) update2(nl, nr, l, mid, p << 1, k);
    if (nr >= mid + 1) update2(nl, nr, mid + 1, r, p << 1 | 1, k);
    pushup(p);
  }
  int query(int nl, int nr, int l, int r, int p) {
    int ret = 0;
    if (nl <= l && nr >= r) return tr[p];
    pushdown(p, l, r);
    int mid = (l + r) >> 1;
    if (nl <= mid) ret += query(nl, nr, l, mid, p << 1);
    if (nr >= mid + 1) ret += query(nl, nr, mid + 1, r, p << 1 | 1);
    return ret;
  }
} seg1, seg2;
int main() {
  scanf("%d %d %d", &n, &m, &k);
  for (int i = 1; i <= k; i++) {
    int w, s, t, d;
    scanf("%d %d %d %d", &s, &t, &d, &w);
    a[i] = {w, s, t, d};
  }
  sort(a + 1, a + 1 + k);
  seg1.build(1, 1, n);
  seg2.build(1, 1, n);
  for (int i = 1; i <= k; i++) {
    seg1.update1(a[i].s, a[i].t, 1, n, 1, 0);
    seg1.update2(a[i].s, a[i].t, 1, n, 1, a[i].val);
    seg2.update1(a[i].s, a[i].t, 1, n, 1, 0);
    seg2.update2(a[i].s, a[i].t, 1, n, 1, a[i].ed);
  }
  for (int i = 1; i <= n; i++) {
    val[i] = seg1.query(i, i, 1, n, 1);
    ed[i] = seg2.query(i, i, 1, n, 1);
  }
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= m; j++) dp[i][j] = inf64;
  dp[0][0] = 0LL;
  for (int i = 1; i <= n; i++) {
    if (!val[i]) {
      for (int j = 0; j <= m; j++) dp[i][j] = min(dp[i - 1][j], dp[i][j]);
    } else {
      dp[ed[i]][0] = min(dp[ed[i]][0], dp[i - 1][0] + val[i]);
      for (int j = 1; j <= m; j++) {
        dp[ed[i]][j] = min(dp[ed[i]][j], dp[i - 1][j] + val[i]);
        dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
      }
    }
  }
  long long ans = inf64;
  for (int i = 0; i <= m; i++) ans = min(ans, dp[n][i]);
  printf("%lld\n", ans);
  return 0;
}
