#include <bits/stdc++.h>
using namespace std;
long long read() {
  long long x = 0, f = 0;
  char ch = getchar();
  while (!isdigit(ch)) f = ch == '-', ch = getchar();
  while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
  return f ? -x : x;
}
template <class T>
void ckmax(T &x, const T &y) {
  if (x < y) x = y;
}
template <class T>
void ckmin(T &x, const T &y) {
  if (x > y) x = y;
}
long long absl(long long x) { return x < 0 ? -x : x; }
const int mod = 998244353;
int Pow(int x, int y) {
  int ans = 1;
  for (; y; y >>= 1, x = (long long)x * x % mod)
    if (y & 1) ans = (long long)ans * x % mod;
  return ans;
}
void Add(int &x, int y) {
  if ((x += y) >= mod) x -= mod;
}
void Del(int &x, int y) {
  if ((x -= y) < 0) x += mod;
}
int Add(int x) { return x >= mod ? x - mod : x; }
int Del(int x) { return x < 0 ? x + mod : x; }
const int N = 3605;
int Fac[N], Inv[N];
void prework(int n) {
  Fac[0] = 1;
  for (int i = (1); i <= (n); i++) Fac[i] = (long long)Fac[i - 1] * i % mod;
  Inv[n] = Pow(Fac[n], mod - 2);
  for (int i = (n); i >= (1); i--) Inv[i - 1] = (long long)Inv[i] * i % mod;
}
int C(int n, int m) {
  if (m > n || m < 0) return 0;
  return (long long)Fac[n] * Inv[m] % mod * Inv[n - m] % mod;
}
int A(int n, int m) {
  if (m > n || m < 0) return 0;
  return (long long)Fac[n] * Inv[n - m] % mod;
}
int n, m, q;
int dp[N][N];
int vr[N], vc[N];
vector<int> solve(int *a, int n) {
  vector<int> now(1, 0);
  for (int i = (1); i <= (n); i++)
    if (a[i] == 0)
      now.back()++;
    else
      now.push_back(0);
  sort(now.begin(), now.end());
  reverse(now.begin(), now.end());
  while (!now.empty() && now.back() == 0) now.pop_back();
  dp[0][0] = dp[1][0] = 1;
  for (int i = (2); i <= (n); i++) {
    dp[i][0] = 1;
    for (int j = (1); j <= (n); j++) {
      dp[i][j] = Add(dp[i - 1][j] + dp[i - 2][j - 1]);
    }
  }
  vector<int> res(n + 1, 0);
  res[0] = 1;
  for (auto i : now) {
    vector<int> now(n + 1, 0);
    for (int j = (0); j <= (n); j++) {
      int v = res[j];
      if (!v) continue;
      for (int k = (0); k <= (i); k++) {
        int u = dp[i][k];
        if (!u) continue;
        Add(now[j + k], (long long)v * u % mod);
      }
    }
    swap(res, now);
  }
  return res;
}
int main() {
  n = read(), m = read(), q = read() * 2;
  prework(max(n, m));
  int rr = n, cc = m;
  while (q--) {
    int x = read(), y = read();
    if (!vr[x]) rr--;
    if (!vc[y]) cc--;
    vr[x] = 1, vc[y] = 1;
  }
  vector<int> a = solve(vr, n);
  vector<int> b = solve(vc, m);
  int ans = 0;
  for (int i = (0); i <= (n); i++)
    for (int j = (0); j <= (m); j++) {
      int t = (long long)a[i] * b[j] % mod;
      if (!t) continue;
      Add(ans, (long long)t * Fac[i] % mod * Fac[j] % mod * C(rr - 2 * i, j) %
                   mod * C(cc - 2 * j, i) % mod);
    }
  cout << ans << endl;
  return 0;
}
