#include <bits/stdc++.h>
using namespace std;
const long long maxn = 100100, inf = 2000000000;
struct Node {
  long long s, t, d, w;
} x[maxn];
struct Value {
  long long d, w;
  Value() {}
  Value(long long _d, long long _w) { d = _d, w = _w; }
  bool operator<(const Value &p) const {
    return make_pair(w, d) < make_pair(p.w, p.d);
  }
  bool operator==(const Value &p) const {
    return make_pair(d, w) == make_pair(p.d, p.w);
  }
  bool operator!=(const Value &p) const { return !(*this == p); }
};
struct Segment_tree {
  Value tag[maxn << 2];
  inline void build(long long p, long long l, long long r) {
    tag[p] = Value(-inf, -inf);
    if (l == r) return;
    long long mid = (l + r) >> 1;
    build((p << 1), l, mid);
    build((p << 1 | 1), mid + 1, r);
  }
  inline void settag(long long p, Value v) { tag[p] = max(tag[p], v); }
  inline void pushdown(long long p) {
    if (tag[p] != Value(inf, inf))
      settag((p << 1), tag[p]), settag((p << 1 | 1), tag[p]);
  }
  inline void setit(long long p, long long l, long long r, long long ql,
                    long long qr, Value v) {
    if (ql <= l && qr >= r) return (void)settag(p, v);
    long long mid = (l + r) >> 1;
    pushdown(p);
    if (ql <= mid) setit((p << 1), l, mid, ql, qr, v);
    if (qr > mid) setit((p << 1 | 1), mid + 1, r, ql, qr, v);
  }
  inline Value Query(long long p, long long l, long long r, long long x) {
    if (l == r) return tag[p];
    long long mid = (l + r) >> 1;
    pushdown(p);
    if (x <= mid)
      return Query((p << 1), l, mid, x);
    else
      return Query((p << 1 | 1), mid + 1, r, x);
  }
} s;
long long n, m, k;
Value nxt[maxn];
long long f[maxn], g[maxn];
long long ans = inf * inf, mxv = 0;
inline void print() {
  for (long long i = 0; i <= n + 1; i++) {
    if (f[i] > inf)
      cout << "inf ";
    else
      cout << f[i] << ' ';
  }
  putchar('\n');
}
inline void update() {
  memset(g, 0x3f, sizeof(g));
  for (long long i = 1; i <= n + 1; i++) {
    g[i] = min(g[i], f[i - 1]);
    if (i == n + 1) continue;
    if (nxt[i].d != -inf)
      g[nxt[i].d + 1] = min(g[nxt[i].d + 1], g[i] + nxt[i].w);
    else
      g[i + 1] = min(g[i + 1], g[i]);
  }
  for (long long i = 0; i <= n + 1; i++) f[i] = g[i];
  for (long long i = mxv + 1; i <= n + 1; i++) ans = min(ans, f[i]);
}
inline void init() {
  scanf("%lld%lld%lld", &n, &m, &k);
  for (long long i = 1; i <= k; i++)
    scanf("%lld%lld%lld%lld", &x[i].s, &x[i].t, &x[i].d, &x[i].w);
  s.build(1, 1, n);
  for (long long i = 1; i <= k; i++)
    s.setit(1, 1, n, x[i].s, x[i].t, Value(x[i].d, x[i].w));
  for (long long i = 1; i <= n; i++) nxt[i] = s.Query(1, 1, n, i);
  memset(f, 0x3f, sizeof(f));
  long long now = 1, nowval = 0;
  f[1] = 0;
  while (now <= n) {
    if (nxt[now].d == -inf) {
      now++;
      f[now] = nowval;
      continue;
    }
    nowval += nxt[now].w;
    now = nxt[now].d + 1;
    f[now] = nowval;
  }
  ans = nowval;
}
signed main() {
  init();
  for (long long i = 1; i <= k; i++) mxv = max(mxv, x[i].t);
  while (m--) update();
  printf("%lld\n", ans);
  return 0;
}
