#include <bits/stdc++.h>
using namespace std;
template <class A, class B>
ostream& operator<<(ostream& out, const pair<A, B>& a) {
  return out << "(" << a.first << ", " << a.second << ")";
}
template <class A>
ostream& operator<<(ostream& out, const vector<A>& a) {
  out << "[";
  for (auto it = a.begin(); it != a.end(); ++it) {
    if (it != a.begin()) out << ", ";
    out << *it;
  }
  return out << "]";
}
const int INF = 1e9;
const long long INF64 = 1e18;
const int MOD = 1e9 + 7;
const long double PI = acosl(-1.0);
const long double EPS = 1e-9;
mt19937 rnd(time(NULL));
mt19937_64 rnd64(time(NULL));
const int N = 5050;
int n, h, m;
pair<pair<int, int>, pair<int, int> > a[N];
bool read() {
  if (scanf("%d %d %d", &n, &h, &m) != 3) return false;
  for (int i = 0; i < int(m); ++i) {
    scanf("%d %d %d %d", &a[i].first.first, &a[i].first.second,
          &a[i].second.first, &a[i].second.second);
    --a[i].first.first;
    --a[i].first.second;
  }
  return true;
}
struct edge {
  int v, to, cap, flow, next;
};
vector<edge> e;
int head[N];
void add_edge(int v, int to, int cap) {
  e.push_back({v, to, cap, 0, head[v]});
  head[v] = int((e).size()) - 1;
  e.push_back({to, v, 0, 0, head[to]});
  head[to] = int((e).size()) - 1;
}
int used[N];
int T, s, t;
int cnt;
int rem(int idx) { return e[idx].cap - e[idx].flow; }
int d[N];
int lst[N];
int bfs() {
  for (int i = 0; i < int(cnt); ++i) d[i] = INF;
  d[s] = 0;
  queue<int> q;
  q.push(s);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (int j = head[v]; j != -1; j = e[j].next) {
      if (rem(j) && d[e[j].to] == INF) {
        d[e[j].to] = d[v] + 1;
        if (e[j].to == t) return true;
        q.push(e[j].to);
      }
    }
  }
  return d[t] != INF;
}
int dfs(int v, int flow) {
  if (v == t) return flow;
  if (flow == 0) return 0;
  int result = 0;
  for (; lst[v] != -1; lst[v] = e[lst[v]].next) {
    int i = lst[v];
    if (d[e[i].to] != d[v] + 1) continue;
    int add = dfs(e[i].to, min(flow, rem(i)));
    result += add;
    flow -= add;
    e[i].flow += add;
    e[i ^ 1].flow -= add;
    if (flow == 0) break;
  }
  return result;
}
int dinic() {
  int flow = 0;
  while (true) {
    if (!bfs()) break;
    for (int v = 0; v < int(cnt); ++v) lst[v] = head[v];
    int add;
    while ((add = dfs(s, INF)) > 0) flow += add;
  }
  return flow;
}
void solve() {
  ++T;
  memset(head, -1, sizeof(head));
  e.clear();
  s = n * h + m, t = s + 1, cnt = t + 1;
  for (int i = 0; i < int(n); ++i)
    for (int j = 0; j < int(h); ++j) {
      add_edge(s, i * h + j, 2 * j + 1);
      for (int p = 0; p < int(m); ++p) {
        if (a[p].first.first <= i && i <= a[p].first.second &&
            j + 1 > a[p].second.first) {
          add_edge(i * h + j, n * h + p, INF);
        }
      }
    }
  for (int i = 0; i < int(m); ++i) add_edge(n * h + i, t, a[i].second.second);
  int res = n * h * h - dinic();
  printf("%d\n", res);
}
int main() {
  cout << fixed << setprecision(10);
  cerr << fixed << setprecision(10);
  if (read()) {
    solve();
  }
}
