#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int N = 2010;
struct queue_max
{
deque<int> q;
deque<int> w;
int sum;
int mx;
queue_max()
{
sum = 0;
mx = 0;
q.clear();
w.clear();
}
inline void init()
{
sum = 0;
mx = 0;
q.clear();
w.clear();
}
inline void add(int x, int ww)
{
while (!q.empty() && q.back() < x)
{
q.pop_back();
w.pop_back();
}
if (q.empty())
{
q.push_back(x);
w.push_back(ww);
mx = x;
sum = ww;
return;
}
q.push_back(x);
w.push_back(ww);
if (x < mx) return;
sum += ww;
if (sum >= MOD) sum -= MOD;
}
inline void del(int x, int ww)
{
if (q.front() != x) return;
q.pop_front();
w.pop_front();
if (q.empty()) return;
if (q.front() == mx)
{
sum -= ww;
if (sum < 0) sum += MOD;
return;
}
mx = q.front();
sum = 0;
for (int i = 0; i < (int)q.size(); i++)
{
if (q[i] != mx) break;
sum += w[i];
if (sum >= MOD) sum -= MOD;
}
}
};
int par[N][N], rg[N][N], mx[N][N];
inline void init(int n, int m)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
par[i][j] = j, rg[i][j] = 0, mx[i][j] = j + 1;
}
inline int find_set(int i, int j)
{
if (par[i][j] == j) return j;
return (par[i][j] = find_set(i, par[i][j]));
}
inline void merge_set(int i, int x1, int x2)
{
x1 = find_set(i, x1);
x2 = find_set(i, x2);
if (x1 == x2) return;
if (rg[i][x1] > rg[i][x2]) swap(x1, x2);
mx[i][x2] = max(mx[i][x2], mx[i][x1]);
par[i][x1] = x2;
if (rg[i][x1] == rg[i][x2]) rg[i][x2]++;
}
inline int gett(int i, int j)
{
return mx[i][find_set(i, j)];
}
queue_max vx[N], vy[N];
int n, m, q, l[N][N], u[N][N], dp[N][N], kol[N][N];
vector<tuple<int, int, int> > a[N], b[N];
inline void solve()
{
cin >> n >> m >> q;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
l[i][j] = -1, u[i][j] = -1;
for (int i = 0; i < m; i++)
a[i].clear();
for (int i = 0; i < n; i++)
b[i].clear();
for (int i = 0; i < q; i++)
{
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
x1--, x2--, y1--, y2--;
if (x1 == x2 || y1 == y2) continue;
x1++, y1++;
a[y1].push_back(make_tuple(x1, x2, y2));
b[x1].push_back(make_tuple(y1, y2, x2));
}
init(m, n);
for (int j = 0; j < m; j++)
for (tuple<int, int, int> t : a[j])
{
int to = get<2>(t);
int s = get<0>(t);
int f = get<1>(t);
for (int x = to; x >= j; x--)
{
if (l[s][x] != -1 && gett(x, s) > f) break;
int p = s;
while (p <= f)
{
if (l[p][x] == -1)
{
l[p][x] = (j - 1);
if (p > 0 && l[p - 1][x] != -1) merge_set(x, p - 1, p);
if (p < n - 1 && l[p + 1][x] != -1) merge_set(x, p, p + 1);
}
p = gett(x, p);
}
}
}
init(n, m);
for (int i = 0; i < n; i++)
for (tuple<int, int, int> t : b[i])
{
int to = get<2>(t);
int s = get<0>(t);
int f = get<1>(t);
for (int x = to; x >= i; x--)
{
if (u[x][s] != -1 && gett(x, s) > f) break;
int p = s;
while (p <= f)
{
if (u[x][p] == -1)
{
u[x][p] = (i - 1);
if (p > 0 && u[x][p - 1] != -1) merge_set(x, p - 1, p);
if (p < m - 1 && u[x][p + 1] != -1) merge_set(x, p, p + 1);
}
p = gett(x, p);
}
}
}
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (l[i][j] == -1) l[i][j] = j;
if (u[i][j] == -1) u[i][j] = i;
}
for (int i = 0; i < n; i++)
vx[i].init();
for (int i = 0; i < m; i++)
vy[i].init();
for (int s = 0; s <= (n + m - 2); s++)
for (int i = 0; i < min(s + 1, n); i++)
{
int j = (s - i);
if (j < 0 || j >= m) continue;
dp[i][j] = 1;
kol[i][j] = 1;
if (i == 0 || j == 0) continue;
vx[i].add(dp[i - 1][j - 1], kol[i - 1][j - 1]);
for (int x = l[i][j - 1]; x < l[i][j]; x++)
vx[i].del(dp[i - 1][x], kol[i - 1][x]);
if (l[i][j] < j)
{
if (dp[i][j] < vx[i].mx + 1)
{
dp[i][j] = vx[i].mx + 1;
kol[i][j] = 0;
}
if (dp[i][j] == vx[i].mx + 1)
{
kol[i][j] += vx[i].sum;
if (kol[i][j] >= MOD) kol[i][j] -= MOD;
}
}
vy[j].add(dp[i - 1][j - 1], kol[i - 1][j - 1]);
for (int x = u[i - 1][j]; x < u[i][j]; x++)
vy[j].del(dp[x][j - 1], kol[x][j - 1]);
if (u[i][j] < i)
{
if (dp[i][j] < vy[j].mx + 1)
{
dp[i][j] = vy[j].mx + 1;
kol[i][j] = 0;
}
if (dp[i][j] == vy[j].mx + 1)
{
kol[i][j] += vy[j].sum;
if (kol[i][j] >= MOD) kol[i][j] -= MOD;
}
}
if (l[i][j] < j && u[i][j] < i && dp[i][j] == dp[i - 1][j - 1] + 1)
{
kol[i][j] -= kol[i - 1][j - 1];
if (kol[i][j] < 0) kol[i][j] += MOD;
}
}
int mx = 0;
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
mx = max(mx, dp[i][j]);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (mx == dp[i][j])
{
ans += kol[i][j];
if (ans >= MOD) ans -= MOD;
}
cout << mx << " " << ans << "\n";
}
int main()
{
ios::sync_with_stdio(0);
int T;
cin >> T;
for (int z = 0; z < T; z++)
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBOID0gMjAxMDsKCnN0cnVjdCBxdWV1ZV9tYXgKewoJZGVxdWU8aW50PiBxOwoJZGVxdWU8aW50PiB3OwoJaW50IHN1bTsKCWludCBteDsKCglxdWV1ZV9tYXgoKQoJewoJCXN1bSA9IDA7CgkJbXggPSAwOwoJCXEuY2xlYXIoKTsKCQl3LmNsZWFyKCk7Cgl9CgoJaW5saW5lIHZvaWQgaW5pdCgpCgl7CgkJc3VtID0gMDsKCQlteCA9IDA7CgkJcS5jbGVhcigpOwoJCXcuY2xlYXIoKTsKCX0KCglpbmxpbmUgdm9pZCBhZGQoaW50IHgsIGludCB3dykKCXsKCQl3aGlsZSAoIXEuZW1wdHkoKSAmJiBxLmJhY2soKSA8IHgpCgkJewoJCQlxLnBvcF9iYWNrKCk7CgkJCXcucG9wX2JhY2soKTsKCQl9CgkJaWYgKHEuZW1wdHkoKSkKCQl7CgkJCXEucHVzaF9iYWNrKHgpOwoJCQl3LnB1c2hfYmFjayh3dyk7CgkJCW14ID0geDsKCQkJc3VtID0gd3c7CgkJCXJldHVybjsKCQl9CgkJcS5wdXNoX2JhY2soeCk7CgkJdy5wdXNoX2JhY2sod3cpOwoJCWlmICh4IDwgbXgpIHJldHVybjsKCQlzdW0gKz0gd3c7CgkJaWYgKHN1bSA+PSBNT0QpIHN1bSAtPSBNT0Q7Cgl9CgoJaW5saW5lIHZvaWQgZGVsKGludCB4LCBpbnQgd3cpCgl7CgkJaWYgKHEuZnJvbnQoKSAhPSB4KSByZXR1cm47CgkJcS5wb3BfZnJvbnQoKTsKCQl3LnBvcF9mcm9udCgpOwoJCWlmIChxLmVtcHR5KCkpIHJldHVybjsKCQlpZiAocS5mcm9udCgpID09IG14KQoJCXsKCQkJc3VtIC09IHd3OwoJCQlpZiAoc3VtIDwgMCkgc3VtICs9IE1PRDsKCQkJcmV0dXJuOwoJCX0KCQlteCA9IHEuZnJvbnQoKTsKCQlzdW0gPSAwOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgKGludClxLnNpemUoKTsgaSsrKQoJCXsKCQkJaWYgKHFbaV0gIT0gbXgpIGJyZWFrOwoJCQlzdW0gKz0gd1tpXTsKCQkJaWYgKHN1bSA+PSBNT0QpIHN1bSAtPSBNT0Q7CgkJfQoJfQp9OwoKaW50IHBhcltOXVtOXSwgcmdbTl1bTl0sIG14W05dW05dOwoKaW5saW5lIHZvaWQgaW5pdChpbnQgbiwgaW50IG0pCnsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJCWZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQoJCQlwYXJbaV1bal0gPSBqLCByZ1tpXVtqXSA9IDAsIG14W2ldW2pdID0gaiArIDE7CQp9CgppbmxpbmUgaW50IGZpbmRfc2V0KGludCBpLCBpbnQgaikKewoJaWYgKHBhcltpXVtqXSA9PSBqKSByZXR1cm4gajsKCXJldHVybiAocGFyW2ldW2pdID0gZmluZF9zZXQoaSwgcGFyW2ldW2pdKSk7Cn0KCmlubGluZSB2b2lkIG1lcmdlX3NldChpbnQgaSwgaW50IHgxLCBpbnQgeDIpCnsKCXgxID0gZmluZF9zZXQoaSwgeDEpOwoJeDIgPSBmaW5kX3NldChpLCB4Mik7CglpZiAoeDEgPT0geDIpIHJldHVybjsKCWlmIChyZ1tpXVt4MV0gPiByZ1tpXVt4Ml0pIHN3YXAoeDEsIHgyKTsKCW14W2ldW3gyXSA9IG1heChteFtpXVt4Ml0sIG14W2ldW3gxXSk7CglwYXJbaV1beDFdID0geDI7CglpZiAocmdbaV1beDFdID09IHJnW2ldW3gyXSkgcmdbaV1beDJdKys7Cn0KCmlubGluZSBpbnQgZ2V0dChpbnQgaSwgaW50IGopCnsKCXJldHVybiBteFtpXVtmaW5kX3NldChpLCBqKV07Cn0KCnF1ZXVlX21heCB2eFtOXSwgdnlbTl07CmludCBuLCBtLCBxLCBsW05dW05dLCB1W05dW05dLCBkcFtOXVtOXSwga29sW05dW05dOwp2ZWN0b3I8dHVwbGU8aW50LCBpbnQsIGludD4gPiBhW05dLCBiW05dOwoKaW5saW5lIHZvaWQgc29sdmUoKQp7CgljaW4gPj4gbiA+PiBtID4+IHE7Cglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCQlmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKCQkJbFtpXVtqXSA9IC0xLCB1W2ldW2pdID0gLTE7Cglmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykKCQlhW2ldLmNsZWFyKCk7Cglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCQliW2ldLmNsZWFyKCk7Cglmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykKCXsKCQlpbnQgeDEsIHkxLCB4MiwgeTI7CgkJY2luID4+IHgxID4+IHkxID4+IHgyID4+IHkyOwoJCXgxLS0sIHgyLS0sIHkxLS0sIHkyLS07CgkJaWYgKHgxID09IHgyIHx8IHkxID09IHkyKSBjb250aW51ZTsKCQl4MSsrLCB5MSsrOwoJCWFbeTFdLnB1c2hfYmFjayhtYWtlX3R1cGxlKHgxLCB4MiwgeTIpKTsKCQliW3gxXS5wdXNoX2JhY2sobWFrZV90dXBsZSh5MSwgeTIsIHgyKSk7Cgl9ICAgICAgICAgICAgICAgIAoJaW5pdChtLCBuKTsgICAgICAgICAgICAgICAgICAgICAgIAoJZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCgkJZm9yICh0dXBsZTxpbnQsIGludCwgaW50PiB0IDogYVtqXSkKCQl7CgkJCWludCB0byA9IGdldDwyPih0KTsKCQkJaW50IHMgPSBnZXQ8MD4odCk7CgkJCWludCBmID0gZ2V0PDE+KHQpOwoJCQlmb3IgKGludCB4ID0gdG87IHggPj0gajsgeC0tKQoJCQl7CgkJCQlpZiAobFtzXVt4XSAhPSAtMSAmJiBnZXR0KHgsIHMpID4gZikgYnJlYWs7CgkJCQlpbnQgcCA9IHM7CgkJCQl3aGlsZSAocCA8PSBmKQoJCQkJewoJCQkJCWlmIChsW3BdW3hdID09IC0xKSAKCQkJCQl7CgkJCQkJCWxbcF1beF0gPSAoaiAtIDEpOwoJCQkJCQlpZiAocCA+IDAgJiYgbFtwIC0gMV1beF0gIT0gLTEpIG1lcmdlX3NldCh4LCBwIC0gMSwgcCk7CgkJCQkJCWlmIChwIDwgbiAtIDEgJiYgbFtwICsgMV1beF0gIT0gLTEpIG1lcmdlX3NldCh4LCBwLCBwICsgMSk7IAoJCQkJCX0KCQkJCQlwID0gZ2V0dCh4LCBwKTsKCQkJCX0JCQkKCQkJfQoJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCWluaXQobiwgbSk7Cglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCQlmb3IgKHR1cGxlPGludCwgaW50LCBpbnQ+IHQgOiBiW2ldKQoJCXsKCQkJaW50IHRvID0gZ2V0PDI+KHQpOwoJCQlpbnQgcyA9IGdldDwwPih0KTsKCQkJaW50IGYgPSBnZXQ8MT4odCk7CgkJCWZvciAoaW50IHggPSB0bzsgeCA+PSBpOyB4LS0pCgkJCXsKCQkJCWlmICh1W3hdW3NdICE9IC0xICYmIGdldHQoeCwgcykgPiBmKSBicmVhazsKCQkJCWludCBwID0gczsKCQkJCXdoaWxlIChwIDw9IGYpCgkJCQl7CgkJCQkJaWYgKHVbeF1bcF0gPT0gLTEpIAoJCQkJCXsKCQkJCQkJdVt4XVtwXSA9IChpIC0gMSk7CgkJCQkJCWlmIChwID4gMCAmJiB1W3hdW3AgLSAxXSAhPSAtMSkgbWVyZ2Vfc2V0KHgsIHAgLSAxLCBwKTsKCQkJCQkJaWYgKHAgPCBtIC0gMSAmJiB1W3hdW3AgKyAxXSAhPSAtMSkgbWVyZ2Vfc2V0KHgsIHAsIHAgKyAxKTsgCgkJCQkJfQoJCQkJCXAgPSBnZXR0KHgsIHApOwoJCQkJfQkJCQoJCQl9CgkJfQoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCgkJZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCgkJewoJCQlpZiAobFtpXVtqXSA9PSAtMSkgbFtpXVtqXSA9IGo7CgkJCWlmICh1W2ldW2pdID09IC0xKSB1W2ldW2pdID0gaTsKCQl9Cglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKCQl2eFtpXS5pbml0KCk7Cglmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykKCQl2eVtpXS5pbml0KCk7ICAgICAgCglmb3IgKGludCBzID0gMDsgcyA8PSAobiArIG0gLSAyKTsgcysrKQoJCWZvciAoaW50IGkgPSAwOyBpIDwgbWluKHMgKyAxLCBuKTsgaSsrKQoJCXsKCQkJaW50IGogPSAocyAtIGkpOwoJCQlpZiAoaiA8IDAgfHwgaiA+PSBtKSBjb250aW51ZTsKCQkJZHBbaV1bal0gPSAxOwoJCQlrb2xbaV1bal0gPSAxOwoJCQlpZiAoaSA9PSAwIHx8IGogPT0gMCkgY29udGludWU7CgkJCXZ4W2ldLmFkZChkcFtpIC0gMV1baiAtIDFdLCBrb2xbaSAtIDFdW2ogLSAxXSk7CgkJCWZvciAoaW50IHggPSBsW2ldW2ogLSAxXTsgeCA8IGxbaV1bal07IHgrKykKCQkJCXZ4W2ldLmRlbChkcFtpIC0gMV1beF0sIGtvbFtpIC0gMV1beF0pOwoJCQlpZiAobFtpXVtqXSA8IGopCgkJCXsKCQkJCWlmIChkcFtpXVtqXSA8IHZ4W2ldLm14ICsgMSkKCQkJCXsKCQkJCQlkcFtpXVtqXSA9IHZ4W2ldLm14ICsgMTsKCQkJCQlrb2xbaV1bal0gPSAwOwoJCQkJfQoJCQkJaWYgKGRwW2ldW2pdID09IHZ4W2ldLm14ICsgMSkKCQkJCXsKCQkJCQlrb2xbaV1bal0gKz0gdnhbaV0uc3VtOwoJCQkJCWlmIChrb2xbaV1bal0gPj0gTU9EKSBrb2xbaV1bal0gLT0gTU9EOwoJCQkJfQoJCQl9CgkJCXZ5W2pdLmFkZChkcFtpIC0gMV1baiAtIDFdLCBrb2xbaSAtIDFdW2ogLSAxXSk7CgkJCWZvciAoaW50IHggPSB1W2kgLSAxXVtqXTsgeCA8IHVbaV1bal07IHgrKykKCQkJCXZ5W2pdLmRlbChkcFt4XVtqIC0gMV0sIGtvbFt4XVtqIC0gMV0pOwoJCQlpZiAodVtpXVtqXSA8IGkpCgkJCXsKCQkJCWlmIChkcFtpXVtqXSA8IHZ5W2pdLm14ICsgMSkKCQkJCXsKCQkJCQlkcFtpXVtqXSA9IHZ5W2pdLm14ICsgMTsKCQkJCQlrb2xbaV1bal0gPSAwOwoJCQkJfQoJCQkJaWYgKGRwW2ldW2pdID09IHZ5W2pdLm14ICsgMSkKCQkJCXsKCQkJCQlrb2xbaV1bal0gKz0gdnlbal0uc3VtOwoJCQkJCWlmIChrb2xbaV1bal0gPj0gTU9EKSBrb2xbaV1bal0gLT0gTU9EOwoJCQkJfQoJCQl9CgkJCWlmIChsW2ldW2pdIDwgaiAmJiB1W2ldW2pdIDwgaSAmJiBkcFtpXVtqXSA9PSBkcFtpIC0gMV1baiAtIDFdICsgMSkKCQkJewoJCQkJa29sW2ldW2pdIC09IGtvbFtpIC0gMV1baiAtIDFdOwoJCQkJaWYgKGtvbFtpXVtqXSA8IDApIGtvbFtpXVtqXSArPSBNT0Q7CgkJCX0KCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJaW50IG14ID0gMDsKCWludCBhbnMgPSAwOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCgkJZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCiAJCQlteCA9IG1heChteCwgZHBbaV1bal0pOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCgkJZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCgkJCWlmIChteCA9PSBkcFtpXVtqXSkgICAKCQkJewoJCQkJYW5zICs9IGtvbFtpXVtqXTsKCQkJCWlmIChhbnMgPj0gTU9EKSBhbnMgLT0gTU9EOwoJCQl9Cgljb3V0IDw8IG14IDw8ICIgIiA8PCBhbnMgPDwgIlxuIjsJCQkJCQp9CgppbnQgbWFpbigpCnsKCWlvczo6c3luY193aXRoX3N0ZGlvKDApOwoJaW50IFQ7CgljaW4gPj4gVDsKCWZvciAoaW50IHogPSAwOyB6IDwgVDsgeisrKQoJCXNvbHZlKCk7CglyZXR1cm4gMDsKfQ==