#include <bits/stdc++.h>
using namespace std;
inline void open(const char *s) {}
inline int rd() {
  static int x, f;
  x = 0;
  f = 1;
  char ch = getchar();
  for (; ch < '0' || ch > '9'; ch = getchar())
    if (ch == '-') f = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  return f > 0 ? x : -x;
}
const int N = 3010;
int n, m, h, id[N][51], cnt = 0;
int tot = 1, head[N];
struct edge {
  int v, f, next;
} e[1000010];
int d[N], cur[N], vs = 0, vt;
inline void add(int u, int v, int f) {
  e[++tot] = edge{v, f, head[u]};
  head[u] = tot;
  e[++tot] = edge{u, 0, head[v]};
  head[v] = tot;
}
inline bool bfs() {
  static queue<int> q;
  while (!q.empty()) q.pop();
  memset(d, -1, (cnt + 1) << 2);
  memset(cur, 0, (cnt + 1) << 2);
  d[vs] = 0;
  cur[vs] = head[vs];
  q.push(vs);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i; i = e[i].next) {
      int v = e[i].v;
      if (!e[i].f || ~d[v]) continue;
      d[v] = d[u] + 1;
      cur[v] = head[v];
      if (v == vt) return 1;
      q.push(v);
    }
  }
  return 0;
}
int dfs(int u, int a) {
  if (u == vt || !a) return a;
  int ans = 0;
  for (int &i = cur[u]; i; i = e[i].next) {
    int v = e[i].v, f = e[i].f;
    if (!f || d[v] != d[u] + 1) continue;
    f = dfs(v, min(f, a));
    if (!f) continue;
    e[i].f -= f;
    e[i ^ 1].f += f;
    a -= f;
    ans += f;
    if (!a) break;
  }
  return ans;
}
inline int gao() {
  int res = 0;
  while (bfs()) res += dfs(vs, 1e9);
  return res;
}
int main() {
  n = rd();
  h = rd();
  m = rd();
  vs = 0;
  vt = cnt = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= h; j++) {
      id[i][j] = ++cnt;
      if (j) add(id[i][j - 1], id[i][j], h * h - j * j);
    }
    add(vs, id[i][0], h * h);
  }
  while (m--) {
    int l = rd(), r = rd(), x = rd(), c = rd();
    ++cnt;
    for (int i = l; i <= r; i++) add(id[i][x], cnt, 1e9);
    add(cnt, vt, c);
  }
  int res = gao();
  cout << n * h * h - res;
  return 0;
}
