#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
long long POW(long long a, long long b, long long MMM = MOD) {
  long long ret = 1;
  for (; b; b >>= 1, a = (a * a) % MMM)
    if (b & 1) ret = (ret * a) % MMM;
  return ret;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) {
  if (a == 0 || b == 0) return a + b;
  return a * (b / gcd(a, b));
}
int dx[] = {0, 1, 0, -1, 1, 1, -1, -1}, dy[] = {1, 0, -1, 0, 1, -1, 1, -1};
int ddx[] = {-1, -2, 1, -2, 2, -1, 2, 1}, ddy[] = {-2, -1, -2, 1, -1, 2, 1, 2};
struct Edge {
  int to, r;
  Edge* ori;
  Edge* rev;
  Edge(int T, int R) { to = T, r = R; }
};
vector<Edge*> v[2605];
void addedge(int f, int t, int r) {
  Edge* ori = new Edge(t, r);
  Edge* rev = new Edge(f, 0);
  ori->rev = rev;
  rev->rev = ori;
  v[f].push_back(ori);
  v[t].push_back(rev);
}
const int S = 2603, T = 2604;
int level[2605], work[2605];
bool bfs() {
  memset((level), -1, sizeof(level));
  ;
  level[S] = 0;
  queue<int> q;
  q.push(S);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (auto& nn : v[x]) {
      int next = nn->to;
      if (level[next] == -1 && nn->r > 0) {
        level[next] = level[x] + 1;
        q.push(next);
      }
    }
  }
  return level[T] != -1;
}
int dfs(int N, int des, int flow) {
  if (N == des) return flow;
  for (int& i = work[N]; i < v[N].size(); i++) {
    int next = v[N][i]->to;
    if (level[next] == level[N] + 1 && v[N][i]->r > 0) {
      int df = dfs(next, des, min(v[N][i]->r, flow));
      if (df > 0) {
        v[N][i]->r -= df;
        v[N][i]->rev->r += df;
        return df;
      }
    }
  }
  return 0;
}
int main() {
  int n, h, m;
  scanf("%d%d%d", &n, &h, &m);
  int ans = n * h * h;
  for (int(i) = (0); (i) <= (n - 1); (i) += (1)) {
    addedge(S, i * 51, h * h);
    for (int(j) = (1); (j) <= (h); (j) += (1))
      addedge(51 * i + j - 1, 51 * i + j, h * h - j * j);
  }
  for (int(i) = (0); (i) <= (m - 1); (i) += (1)) {
    int x, y, z, w;
    scanf("%d%d%d%d", &x, &y, &z, &w);
    x--, y--;
    for (int(j) = (x); (j) <= (y); (j) += (1))
      addedge(51 * j + z, 2551 + i, 987654321);
    addedge(2551 + i, T, w);
  }
  while (bfs()) {
    memset((work), 0, sizeof(work));
    ;
    while (1) {
      int f = dfs(S, T, 987654321);
      if (f == 0) break;
      ans -= f;
    }
  }
  printf("%d\n", ans);
}
