#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
struct tr {
  int l, r, c, p;
} a[maxn], b[maxn];
int n, k, m, maxr = 0;
long long ans = 0, num[maxn << 2], sum[maxn << 2];
bool cmpl(tr a, tr b) { return a.l < b.l; }
bool cmpr(tr a, tr b) { return a.r < b.r; }
void update(int o, int l, int r, int c, int p) {
  if (l == r) {
    num[o] += c;
    sum[o] += 1LL * c * l;
    return;
  }
  int mid = (l + r) >> 1;
  if (p <= mid)
    update(o << 1, l, mid, c, p);
  else
    update(o << 1 | 1, mid + 1, r, c, p);
  num[o] = num[o << 1] + num[o << 1 | 1];
  sum[o] = sum[o << 1] + sum[o << 1 | 1];
}
long long query(int o, int l, int r, int p) {
  if (l == r) {
    if (p <= num[o]) return 1LL * l * p;
    return sum[o];
  }
  int mid = (l + r) >> 1;
  if (num[o << 1] >= p) return query(o << 1, l, mid, p);
  return query(o << 1 | 1, mid + 1, r, p - num[o << 1]) + sum[o << 1];
}
int main() {
  scanf("%d%d%d", &n, &k, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d%d", &a[i].l, &a[i].r, &a[i].c, &a[i].p);
    b[i] = a[i];
  }
  for (int i = 1; i <= m; i++) maxr = max(maxr, a[i].p);
  sort(a + 1, a + m + 1, cmpl);
  sort(b + 1, b + m + 1, cmpr);
  for (int i = 1, j = 1, o = 1; i <= n; i++) {
    while (j <= m && a[j].l == i) update(1, 1, maxr, a[j].c, a[j].p), j++;
    ans += query(1, 1, maxr, k);
    while (o <= m && b[o].r == i) update(1, 1, maxr, -b[o].c, b[o].p), o++;
  }
  printf("%lld", ans);
  return 0;
}
