#include <bits/stdc++.h>
using namespace std;
const int maxN = 3004;
long long INF = 1ll << 44;
vector<int> G[maxN];
long long cap[maxN][maxN];
int mp[maxN][maxN];
struct Max_flow {
  vector<int>* G;
  int source, target, bfsctr, parent[maxN], vis[maxN], Q[maxN];
  bool bfs() {
    vis[source] = ++bfsctr;
    Q[0] = source;
    for (int qF = 0, qB = 1; qF != qB; qF++) {
      int v = Q[qF];
      for (int u : G[v]) {
        if (vis[u] == bfsctr or cap[v][u] <= 0) continue;
        vis[u] = bfsctr;
        parent[u] = v;
        Q[qB++] = u;
        if (u == target) {
          qF = qB - 1;
          break;
        }
      }
    }
    return vis[target] == bfsctr;
  }
  long long maxflow(vector<int>* Gin, int n, int src, int trg) {
    G = Gin;
    source = src;
    target = trg;
    long long res = 0;
    while (bfs()) {
      long long mc = INF;
      for (int v = target; v != source; v = parent[v])
        mc = min(mc, cap[parent[v]][v]);
      for (int v = target; v != source; v = parent[v])
        cap[parent[v]][v] -= mc, cap[v][parent[v]] += mc;
      res += mc;
    }
    return res;
  }
} alg;
void conn(int a, int b, long long c) {
  G[a].push_back(b);
  G[b].push_back(a);
  cap[a][b] = c;
}
int main() {
  int n, H, m;
  scanf("%d%d%d", &n, &H, &m);
  int num = 0;
  for (int i = (1); i < (n + 1); i++)
    for (int h = (0); h < (H + 1); h++) mp[i][h] = ++num;
  int src = ++num, trg = ++num;
  for (int i = (1); i < (n + 1); i++) {
    conn(src, mp[i][0], H * H);
    for (int h = (0); h < (H); h++)
      conn(mp[i][h], mp[i][h + 1], H * H - (h + 1) * (h + 1));
    conn(mp[i][H], trg, INF);
  }
  while (m--) {
    int a, b, x, c, v = ++num;
    scanf("%d%d%d%d", &a, &b, &x, &c);
    for (int i = (a); i < (b + 1); i++) conn(mp[i][x], v, INF);
    conn(v, trg, c);
  }
  printf("%lld\n", 1ll * n * H * H - alg.maxflow(G, num, src, trg));
  return 0;
}
