#include <bits/stdc++.h>
using namespace std;
char getc() {
  char c = getchar();
  while (c != '<' && c != '>') c = getchar();
  return c;
}
int gcd(int n, int m) { return m == 0 ? n : gcd(m, n % m); }
int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
  return x * f;
}
int n, m, h, p[55 * 55], d[55 * 55], cur[55 * 55], q[55 * 55], id[55][55], cnt,
    t = -1, ans;
struct data {
  int to, nxt, cap, flow;
} edge[55 * 55 << 2];
void addedge(int x, int y, int z) {
  t++;
  edge[t].to = y, edge[t].nxt = p[x], edge[t].cap = z, edge[t].flow = 0,
  p[x] = t;
  t++;
  edge[t].to = x, edge[t].nxt = p[y], edge[t].cap = 0, edge[t].flow = 0,
  p[y] = t;
}
bool bfs() {
  memset(d, 255, sizeof(d));
  d[0] = 0;
  int head = 0, tail = 1;
  q[1] = 0;
  do {
    int x = q[++head];
    for (int i = p[x]; ~i; i = edge[i].nxt)
      if (d[edge[i].to] == -1 && edge[i].flow < edge[i].cap) {
        d[edge[i].to] = d[x] + 1;
        q[++tail] = edge[i].to;
      }
  } while (head < tail);
  return ~d[3000];
}
int work(int k, int f) {
  if (k == 3000) return f;
  int used = 0;
  for (int i = cur[k]; ~i; i = edge[i].nxt)
    if (d[k] + 1 == d[edge[i].to]) {
      int w = work(edge[i].to, min(f - used, edge[i].cap - edge[i].flow));
      edge[i].flow += w, edge[i ^ 1].flow -= w;
      if (edge[i].flow < edge[i].cap) cur[k] = i;
      used += w;
      if (used == f) return f;
    }
  if (used == 0) d[k] = -1;
  return used;
}
void dinic() {
  while (bfs()) {
    memcpy(cur, p, sizeof(p));
    ans += work(0, 55 * 55 * 55);
  }
}
signed main() {
  n = read(), h = read(), m = read();
  memset(p, 255, sizeof(p));
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= h; j++) id[i][j] = ++cnt;
  for (int i = 1; i <= n; i++) {
    addedge(0, id[i][1], h * h);
    for (int j = 1; j < h; j++) addedge(id[i][j], id[i][j + 1], h * h - j * j);
  }
  for (int i = 1; i <= m; i++) {
    int l = read(), r = read(), x = read(), c = read();
    if (x < h) {
      cnt++;
      for (int j = l; j <= r; j++) addedge(id[j][x + 1], cnt, 55 * 55 * 55);
      addedge(cnt, 3000, c);
    }
  }
  dinic();
  cout << n * h * h - ans;
  return 0;
}
