#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 79;
struct edge {
  int u, v, c, f;
};
class maxflow {
  vector<vector<int> > g;
  vector<int> d, id;
  vector<edge> e;
  queue<int> q;
  int n, s, t;
  bool bfs() {
    d.assign(n, -1), id.assign(n, 0);
    q.push(s);
    d[s] = 0;
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      for (int i : g[u])
        if (d[e[i].v] == -1 && e[i].f < e[i].c)
          d[e[i].v] = d[u] + 1, q.push(e[i].v);
    }
    return d[t] != -1;
  }
  int dfs(int u, int pushed = inf) {
    if (u == t) return pushed;
    for (; id[u] < g[u].size(); id[u]++) {
      int i = g[u][id[u]];
      if (e[i].c == e[i].f || d[e[i].v] != d[u] + 1) continue;
      int push = dfs(e[i].v, min(pushed, e[i].c - e[i].f));
      if (!push) continue;
      e[i].f += push, e[i ^ 1].f -= push;
      return push;
    }
    return 0;
  }

 public:
  maxflow(int N, int S, int T) : g(vector<vector<int> >(N)), n(N), s(S), t(T) {}
  void add(int u, int v, int c) {
    e.push_back({u, v, c, 0}), e.push_back({v, u, c, c});
    g[u].push_back(e.size() - 2), g[v].push_back(e.size() - 1);
  }
  int flow() {
    int ans = 0;
    while (bfs()) ans += dfs(s);
    return ans;
  }
};
int n, h, m, N, source, sink;
int get(int pos, int height) {
  if (height == 0) return source;
  if (height == h + 1) return sink;
  return (height - 1) * n + pos;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> h >> m;
  N = n * h + n * m + 2, source = N - 2, sink = N - 1;
  maxflow f(N, source, sink);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j <= h; j++) {
      f.add(get(i, j + 1), get(i, j), inf);
      f.add(get(i, j), get(i, j + 1), h * h - j * j);
    }
  }
  for (int i = 0, l, r, x, c; i < m; i++) {
    cin >> l >> r >> x >> c;
    l--, r--;
    f.add(n * h + i, sink, c);
    for (int j = l; j <= r; j++) {
      f.add(get(j, x + 1), n * h + i, inf);
    }
  }
  cout << n * h * h - f.flow() << "\n";
  return 0;
}
