#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int inf = 0x3f3f3f3f;
const int maxn = 3605;
const int mod = 998244353;
int h, w, n;
bool r[maxn], c[maxn];
ll dp[maxn][1805];
ll f[1805][1805], jc[maxn], inv[maxn];
inline void add(ll &x, ll y) {
  x += y;
  if (x > mod) x -= mod;
}
inline ll CC(ll x, ll y) {
  if (x < y) return 0;
  return jc[x] * inv[y] % mod * inv[x - y] % mod;
}
int main() {
  jc[0] = 1;
  for (int i = 1; i <= maxn - 1; i++) jc[i] = jc[i - 1] * i % mod;
  inv[0] = inv[1] = 1;
  for (int i = 2; i <= maxn - 1; i++)
    inv[i] = (mod - mod / i) * inv[mod % i] % mod;
  for (int i = 2; i <= maxn - 1; i++) inv[i] = inv[i] * inv[i - 1] % mod;
  cin >> h >> w >> n;
  for (int i = 1; i <= n; i++) {
    int r1, c1, r2, c2;
    cin >> r1 >> c1 >> r2 >> c2;
    r[r1] = r[r2] = 1;
    c[c1] = c[c2] = 1;
  }
  int R = 0, C = 0;
  for (int i = 1; i <= h; i++) {
    if (!r[i]) R++;
  }
  for (int i = 1; i <= w; i++) {
    if (!c[i]) C++;
  }
  dp[1][0] = dp[0][0] = 1;
  for (int i = 2; i <= h; i++) {
    dp[i][0] = 1;
    int up = min(i / 2, R / 2);
    for (int j = 1; j <= up; j++) {
      dp[i][j] = dp[i - 1][j];
      if (!r[i] && !r[i - 1]) add(dp[i][j], dp[i - 2][j - 1]);
    }
  }
  for (int a = 0; a <= R / 2; a++)
    for (int b = 0; b <= C / 2; b++) {
      f[a][b] = dp[h][a] * CC(R - 2 * a, b) % mod;
    }
  for (int i = 2; i <= w; i++) {
    memset(dp[i], 0, sizeof dp[i]);
    dp[i][0] = 1;
    int up = min(i / 2, C / 2);
    for (int j = 1; j <= up; j++) {
      dp[i][j] = dp[i - 1][j];
      if (!c[i] && !c[i - 1]) add(dp[i][j], dp[i - 2][j - 1]);
    }
  }
  ll ans = 0;
  for (int a = 0; a <= C / 2; a++)
    for (int b = 0; b <= R / 2; b++) {
      ll t = dp[w][a] * CC(C - 2 * a, b) % mod;
      ans += t * f[b][a] % mod * jc[a] % mod * jc[b] % mod;
    }
  cout << ans % mod << "\n";
  return 0;
}
