#include <bits/stdc++.h>
using namespace std;
namespace io {
const int l = 1 << 20;
char buf[l], *s, *t;
inline char gc() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, l, stdin);
    return s == t ? EOF : *s++;
  }
  return *s++;
}
char c;
template <class IT>
inline void gi(IT &x) {
  x = 0;
  c = gc();
  while (c < '0' || c > '9') c = gc();
  while ('0' <= c && c <= '9') {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = gc();
  }
}
};  // namespace io
using io::gi;
template <class IT>
inline void _int(IT &a, IT &b) {
  if (a > b) swap(a, b);
}
template <class IT>
inline void cmin(IT &a, const IT &b = 0) {
  if (a > b) a = b;
}
template <class IT>
inline void cmax(IT &a, const IT &b = 0) {
  if (a < b) a = b;
}
template <class IT>
inline IT _min(const IT &a, const IT &b = 0) {
  return a > b ? b : a;
}
template <class IT>
inline IT _max(const IT &a, const IT &b = 0) {
  return a < b ? b : a;
}
template <class IT>
inline IT _abs(const IT &a) {
  return a < 0 ? -a : a;
}
const long long p = 998244353ll;
inline long long expo(long long a, int b = 998244351) {
  long long c = 1ll;
  while (b) {
    if (b & 1) c = c * a % p;
    b >>= 1;
    a = a * a % p;
  }
  return c;
}
const int M = 3600, N = 4805;
long long fac[M + 5], ifa[M + 5];
inline long long A(int a, int b) {
  return a >= b ? fac[a] * ifa[a - b] % p : 0;
}
inline long long C(int a, int b) {
  return fac[a] * (ifa[a - b] * ifa[b] % p) % p;
}
int f[2][N], g[2][N], x[N], y[N];
int main() {
  long long z = 0ll;
  int h, w, n, a, b, c, e, d, s, t, r, i, j, k;
  fac[0] = 1ll;
  for (i = 1; i <= M; ++i) fac[i] = fac[i - 1] * i % p;
  ifa[M] = expo(fac[M]);
  for (i = M; i; --i) ifa[i - 1] = ifa[i] * i % p;
  scanf("%d%d%d", &h, &w, &n);
  x[1] = h;
  y[1] = w;
  for (i = 1; i <= n; ++i) {
    scanf("%d%d%d%d", &a, &c, &b, &d);
    x[i << 1] = a - 1;
    x[i << 1 | 1] = b;
    y[i << 1] = c - 1;
    y[i << 1 | 1] = d;
  }
  a = b = c = t = 0;
  n = (n + 1) << 1;
  sort(x, x + n);
  sort(y, y + n);
  f[0][0] = g[0][0] = 1;
  for (i = 0; i < n; i += 2)
    if (x[i] != x[i | 1]) {
      d = x[i | 1] - x[i];
      a += d;
      c ^= 1;
      memset(f[c], 0, sizeof(f[c]));
      r = d >> 1;
      for (j = 0; j <= r; ++j)
        for (k = 0; k <= t; ++k)
          f[c][k + j] = (f[c][k + j] + f[c ^ 1][k] * C(d - j, j)) % p;
      t += r;
    }
  e = s = 0;
  for (i = 0; i < n; i += 2)
    if (y[i] != y[i | 1]) {
      d = y[i | 1] - y[i];
      b += d;
      e ^= 1;
      memset(g[e], 0, sizeof(g[e]));
      r = d >> 1;
      for (j = 0; j <= r; ++j)
        for (k = 0; k <= s; ++k)
          g[e][k + j] = (g[e][k + j] + g[e ^ 1][k] * C(d - j, j)) % p;
      s += r;
    }
  for (i = 0; i <= t; ++i)
    for (j = 0; j <= s; ++j)
      z = (z + (((long long)f[c][i]) * g[e][j] % p) *
                   (A(a - (i << 1), j) * A(b - (j << 1), i) % p)) %
          p;
  printf("%I64d", z);
  return 0;
}
