#include <bits/stdc++.h>   using namespace std;   inline void read(int &x) {     int v = 0, f = 1;     char c = getchar();     while (!isdigit(c) && c !=  - ) c = getchar();     if (c ==  - )       f = -1;     else       v = (c & 15);     while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);     x = v * f;   }   inline void read(long long &x) {     long long v = 0ll, f = 1ll;     char c = getchar();     while (!isdigit(c) && c !=  - ) c = getchar();     if (c ==  - )       f = -1;     else       v = (c & 15);     while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);     x = v * f;   }   inline void readc(char &x) {     char c;     while (((c = getchar()) ==    ) || c ==   n )       ;     x = c;   }   inline void writes(string s) { puts(s.c_str()); }   inline void writeln() { writes(  ); }   inline void writei(int x) {     if (x < 0) {       putchar( - );       x = abs(x);     }     if (!x) putchar( 0 );     char a[25];     int top = 0;     while (x) {       a[++top] = (x % 10) +  0 ;       x /= 10;     }     while (top) {       putchar(a[top]);       top--;     }   }   inline void writell(long long x) {     if (x < 0) {       putchar( - );       x = abs(x);     }     if (!x) putchar( 0 );     char a[25];     int top = 0;     while (x) {       a[++top] = (x % 10) +  0 ;       x /= 10;     }     while (top) {       putchar(a[top]);       top--;     }   }   int n, m, k, i, j, f[3605][1805], g[3605][1805], c1[3605], c2[3605], s1, s2, x,       y, mod = 998244353, fac[3605], inv[3605], first[3605], ans;   int p(int x, int y) {     if (x < y) return 0;     return 1ll * fac[x] * first[x - y] % mod;   }   int main() {     fac[0] = fac[1] = inv[0] = inv[1] = first[0] = first[1] = 1;     for ((i) = (2); (i) <= (3600); (i)++) {       fac[i] = 1ll * fac[i - 1] * i % mod;       inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;       first[i] = 1ll * first[i - 1] * inv[i] % mod;     }     read(n);     read(m);     read(k);     for (((i)) = (1); ((i)) <= ((k)); ((i))++) {       read(x);       read(y);       int lx = x, ly = y;       if (++c1[x] > 1) {         puts( 0 );         return 0;       }       if (++c2[y] > 1) {         puts( 0 );         return 0;       }       read(x);       read(y);       if (lx != x && ++c1[x] > 1) {         puts( 0 );         return 0;       }       if (ly != y && ++c2[y] > 1) {         puts( 0 );         return 0;       }     }     c1[0] = c2[0] = 1;     f[0][0] = 1;     for (((i)) = (1); ((i)) <= ((n)); ((i))++) {       if (c1[i] == 0) s1++;       for ((j) = (0); (j) <= (i / 2); (j)++) {         f[i][j] = f[i - 1][j];         if (c1[i] == 0 && c1[i - 1] == 0) {           (f[i][j] += f[i - 2][j - 1]) %= mod;         }       }     }     g[0][0] = 1;     for (((i)) = (1); ((i)) <= ((m)); ((i))++) {       if (c2[i] == 0) s2++;       for ((j) = (0); (j) <= (i / 2); (j)++) {         g[i][j] = g[i - 1][j];         if (c2[i] == 0 && c2[i - 1] == 0) {           (g[i][j] += g[i - 2][j - 1]) %= mod;         }       }     }     for ((i) = (0); (i) <= (n / 2); (i)++)       for ((j) = (0); (j) <= (m / 2); (j)++) {         ans = (ans + 1ll * f[n][i] * g[m][j] % mod * p(s2 - 2 * j, i) % mod *                          p(s1 - 2 * i, j)) %               mod;       }     cout << ans << endl;     return 0;   }