#include <iostream>
#include <algorithm>
#include <string>
#include <assert.h>
using namespace std;
long long readInt(long long l,long long r,char endd){
long long x=0;
int cnt=0;
int fi=-1;
bool is_neg=false;
while(true){
char g=getchar();
if(g=='-'){
assert(fi==-1);
is_neg=true;
continue;
}
if('0'<=g && g<='9'){
x*=10;
x+=g-'0';
if(cnt==0){
fi=g-'0';
}
cnt++;
assert(fi!=0 || cnt==1);
assert(fi!=0 || is_neg==false);
assert(!(cnt>19 || ( cnt==19 && fi>1) ));
} else if(g==endd){
assert(cnt>0);
if(is_neg){
x= -x;
}
assert(l<=x && x<=r);
return x;
} else {
assert(false);
}
}
}
string readString(int l,int r,char endd){
string ret="";
int cnt=0;
while(true){
char g=getchar();
assert(g!=-1);
if(g==endd){
break;
}
cnt++;
ret+=g;
}
assert(l<=cnt && cnt<=r);
return ret;
}
long long readIntSp(long long l,long long r){
return readInt(l,r,' ');
}
long long readIntLn(long long l,long long r){
return readInt(l,r,'\n');
}
string readStringLn(int l,int r){
return readString(l,r,'\n');
}
string readStringSp(int l,int r){
return readString(l,r,' ');
}
struct rect{
int r1,r2;
int c1,c2;
};
bool comp(rect a,rect b){
return a.r1 < b.r1;
}
bool comp2(rect a,rect b){
return a.c1 < b.c1;
}
int T;
int n,m,q;
int sgt[40400];
int idx[40400];
rect arr[500500];
int sm_nm=0,sm_q=0;
void build(int nd,int l,int r){
if(l==r){
sgt[nd] = -1;
idx[nd]= l;
return;
}
int m=(r+l)/2;
build(2*nd,l,m);
build(2*nd+1,m+1,r);
if(sgt[2*nd]< sgt[2*nd+1]){
sgt[nd] = sgt[2*nd];
idx[nd] = idx[2*nd];
} else {
sgt[nd] = sgt[2*nd+1];
idx[nd] = idx[2*nd+1];
}
}
void update(int nd,int l,int r,int ind,int val){
if(l==r){
sgt[nd] = val;
return;
}
int m=(r+l)/2;
if(ind <= m){
update(2*nd,l,m,ind,val);
} else {
update(2*nd+1,m+1,r,ind,val);
}
if(sgt[2*nd]< sgt[2*nd+1]){
sgt[nd] = sgt[2*nd];
idx[nd] = idx[2*nd];
} else {
sgt[nd] = sgt[2*nd+1];
idx[nd] = idx[2*nd+1];
}
}
pair<int,int> query(int nd,int l,int r,int s, int e){
if(s<=l && r<=e){
return make_pair(sgt[nd],idx[nd]);
}
int m=(r+l)/2;
pair<int,int> ret = make_pair(100000,-1);
if(s<=m){
ret = query(2*nd,l,m,s,e);
}
if(m+1<=e){
pair<int,int> g = query(2*nd+1,m+1,r,s,e);
if(ret.first > g.first){
ret = g;
}
}
return ret;
}
int down[2020][2020];
int lft[2020][2020];
// remember the case when there's only one rectangle 1 1 1 4
int dp[2020][2020];
int cnt[2020][2020];
int mod=1000000007;
int main(){
T=readIntLn(1,1000);
while(T--){
n=readIntSp(1,2000);
m=readIntSp(1,2000);
q=readIntLn(1,500000);
sm_nm += n*m;
assert(sm_nm<=10000000);
sm_q += q;
assert(sm_q<=500000);
for(int i=0;i<q;i++){
arr[i].r1 = readIntSp(1,n);
arr[i].c1 = readIntSp(1,m);
arr[i].r2 = readIntSp(1,n);
arr[i].c2 = readIntLn(1,m);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
down[i][j] = lft[i][j] = -1;
}
}
sort(arr,arr+q,comp);
build(1,1,m);
for(int i=0;i<q;i++){
if(arr[i].c1 == arr[i].c2 || arr[i].r1 == arr[i].r2)continue;
pair<int,int> h = query(1,1,m,arr[i].c1+1,arr[i].c2);
while(h.first <= arr[i].r2){
for(int j = max(h.first,arr[i].r1+1);j<=arr[i].r2;j++){
down[j][h.second] = arr[i].r1;
}
update(1,1,m,h.second,arr[i].r2+1);
h = query(1,1,m,arr[i].c1+1,arr[i].c2);
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<down[i][j]<<" ";
}
cout<<endl;
}
while(1);*/
sort(arr,arr+q,comp2);
build(1,1,n);
for(int i=0;i<q;i++){
if(arr[i].c1 == arr[i].c2 || arr[i].r1 == arr[i].r2)continue;
pair<int,int> h = query(1,1,n,arr[i].r1+1,arr[i].r2);
while(h.first <= arr[i].c2){
for(int j = max(h.first,arr[i].c1+1);j<=arr[i].c2;j++){
lft[h.second][j] = arr[i].c1;
}
update(1,1,n,h.second,arr[i].c2+1);
h = query(1,1,n,arr[i].r1+1,arr[i].r2);
}
}
int sol = 0;
int co = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[i][j] = 1;
cnt[i][j] = 1;
if ( down[i][j] != -1)
for(int k=down[i][j] ; k<=i-2;k++){
if(dp[k][j-1] + 1 > dp[i][j] ){
dp[i][j] = dp[k][j-1] + 1;
cnt[i][j] = cnt[k][j-1];
} else if(dp[k][j-1] + 1 == dp[i][j] ){
cnt[i][j] += cnt[k][j-1];
cnt[i][j] %= mod;
}
}
if ( lft[i][j] != -1)
for(int k=lft[i][j] ; k<=j-1;k++){
if(dp[i-1][k] + 1 > dp[i][j] ){
dp[i][j] = dp[i-1][k] + 1;
cnt[i][j] = cnt[i-1][k];
} else if(dp[i-1][k] + 1 == dp[i][j] ){
cnt[i][j] += cnt[i-1][k];
cnt[i][j] %= mod;
}
}
if(dp[i][j] > sol ){
sol = dp[i][j];
co = cnt[i][j];
} else if (dp[i][j] == sol){
co += cnt[i][j];
co %= mod;
}
}
}
cout<<sol<<" "<<co<<endl;
}
assert(getchar()==-1);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKCmxvbmcgbG9uZyByZWFkSW50KGxvbmcgbG9uZyBsLGxvbmcgbG9uZyByLGNoYXIgZW5kZCl7Cglsb25nIGxvbmcgeD0wOwoJaW50IGNudD0wOwoJaW50IGZpPS0xOwoJYm9vbCBpc19uZWc9ZmFsc2U7Cgl3aGlsZSh0cnVlKXsKCQljaGFyIGc9Z2V0Y2hhcigpOwoJCWlmKGc9PSctJyl7CgkJCWFzc2VydChmaT09LTEpOwoJCQlpc19uZWc9dHJ1ZTsKCQkJY29udGludWU7CgkJfQoJCWlmKCcwJzw9ZyAmJiBnPD0nOScpewoJCQl4Kj0xMDsKCQkJeCs9Zy0nMCc7CgkJCWlmKGNudD09MCl7CgkJCQlmaT1nLScwJzsKCQkJfQoJCQljbnQrKzsKCQkJYXNzZXJ0KGZpIT0wIHx8IGNudD09MSk7CgkJCWFzc2VydChmaSE9MCB8fCBpc19uZWc9PWZhbHNlKTsKCQkJCgkJCWFzc2VydCghKGNudD4xOSB8fCAoIGNudD09MTkgJiYgZmk+MSkgKSk7CgkJfSBlbHNlIGlmKGc9PWVuZGQpewoJCQlhc3NlcnQoY250PjApOwoJCQlpZihpc19uZWcpewoJCQkJeD0gLXg7CgkJCX0KCQkJYXNzZXJ0KGw8PXggJiYgeDw9cik7CgkJCXJldHVybiB4OwoJCX0gZWxzZSB7CgkJCWFzc2VydChmYWxzZSk7CgkJfQoJfQp9CnN0cmluZyByZWFkU3RyaW5nKGludCBsLGludCByLGNoYXIgZW5kZCl7CglzdHJpbmcgcmV0PSIiOwoJaW50IGNudD0wOwoJd2hpbGUodHJ1ZSl7CgkJY2hhciBnPWdldGNoYXIoKTsKCQlhc3NlcnQoZyE9LTEpOwoJCWlmKGc9PWVuZGQpewoJCQlicmVhazsKCQl9CgkJY250Kys7CgkJcmV0Kz1nOwoJfQoJYXNzZXJ0KGw8PWNudCAmJiBjbnQ8PXIpOwoJcmV0dXJuIHJldDsKfQpsb25nIGxvbmcgcmVhZEludFNwKGxvbmcgbG9uZyBsLGxvbmcgbG9uZyByKXsKCXJldHVybiByZWFkSW50KGwsciwnICcpOwp9CmxvbmcgbG9uZyByZWFkSW50TG4obG9uZyBsb25nIGwsbG9uZyBsb25nIHIpewoJcmV0dXJuIHJlYWRJbnQobCxyLCdcbicpOwp9CnN0cmluZyByZWFkU3RyaW5nTG4oaW50IGwsaW50IHIpewoJcmV0dXJuIHJlYWRTdHJpbmcobCxyLCdcbicpOwp9CnN0cmluZyByZWFkU3RyaW5nU3AoaW50IGwsaW50IHIpewoJcmV0dXJuIHJlYWRTdHJpbmcobCxyLCcgJyk7Cn0Kc3RydWN0IHJlY3R7CglpbnQgcjEscjI7CglpbnQgYzEsYzI7Cn07CmJvb2wgY29tcChyZWN0IGEscmVjdCBiKXsKCXJldHVybiBhLnIxIDwgYi5yMTsKfQpib29sIGNvbXAyKHJlY3QgYSxyZWN0IGIpewoJcmV0dXJuIGEuYzEgPCBiLmMxOwp9CmludCBUOwppbnQgbixtLHE7CmludCBzZ3RbNDA0MDBdOwppbnQgaWR4WzQwNDAwXTsKcmVjdCBhcnJbNTAwNTAwXTsKaW50IHNtX25tPTAsc21fcT0wOwoKdm9pZCBidWlsZChpbnQgbmQsaW50IGwsaW50IHIpewoJaWYobD09cil7CgkJc2d0W25kXSA9IC0xOwoJCWlkeFtuZF09IGw7CgkJcmV0dXJuOwoJfQoJaW50IG09KHIrbCkvMjsKCWJ1aWxkKDIqbmQsbCxtKTsKCWJ1aWxkKDIqbmQrMSxtKzEscik7CglpZihzZ3RbMipuZF08IHNndFsyKm5kKzFdKXsKCQlzZ3RbbmRdID0gc2d0WzIqbmRdOwoJCWlkeFtuZF0gPSBpZHhbMipuZF07Cgl9IGVsc2UgewoJCXNndFtuZF0gPSBzZ3RbMipuZCsxXTsKCQlpZHhbbmRdID0gaWR4WzIqbmQrMV07Cgl9Cn0KCnZvaWQgdXBkYXRlKGludCBuZCxpbnQgbCxpbnQgcixpbnQgaW5kLGludCB2YWwpewoJaWYobD09cil7CgkJc2d0W25kXSA9IHZhbDsKCQlyZXR1cm47Cgl9CglpbnQgbT0ocitsKS8yOwoJaWYoaW5kIDw9IG0pewoJCXVwZGF0ZSgyKm5kLGwsbSxpbmQsdmFsKTsKCX0gZWxzZSB7CgkJdXBkYXRlKDIqbmQrMSxtKzEscixpbmQsdmFsKTsKCX0KCWlmKHNndFsyKm5kXTwgc2d0WzIqbmQrMV0pewoJCXNndFtuZF0gPSBzZ3RbMipuZF07CgkJaWR4W25kXSA9IGlkeFsyKm5kXTsKCX0gZWxzZSB7CgkJc2d0W25kXSA9IHNndFsyKm5kKzFdOwoJCWlkeFtuZF0gPSBpZHhbMipuZCsxXTsKCX0KfQoKCgpwYWlyPGludCxpbnQ+IHF1ZXJ5KGludCBuZCxpbnQgbCxpbnQgcixpbnQgcywgaW50IGUpewoJaWYoczw9bCAmJiByPD1lKXsKCQlyZXR1cm4gbWFrZV9wYWlyKHNndFtuZF0saWR4W25kXSk7Cgl9CglpbnQgbT0ocitsKS8yOwoJcGFpcjxpbnQsaW50PiByZXQgPSBtYWtlX3BhaXIoMTAwMDAwLC0xKTsKCWlmKHM8PW0pewoJCXJldCA9IHF1ZXJ5KDIqbmQsbCxtLHMsZSk7Cgl9CglpZihtKzE8PWUpewoJCXBhaXI8aW50LGludD4gZyA9IHF1ZXJ5KDIqbmQrMSxtKzEscixzLGUpOwoJCWlmKHJldC5maXJzdCA+IGcuZmlyc3QpewoJCQlyZXQgPSBnOwoJCX0KCX0KCXJldHVybiByZXQ7Cn0KCmludCBkb3duWzIwMjBdWzIwMjBdOwppbnQgbGZ0WzIwMjBdWzIwMjBdOwoKLy8gcmVtZW1iZXIgdGhlIGNhc2Ugd2hlbiB0aGVyZSdzIG9ubHkgb25lIHJlY3RhbmdsZSAxIDEgMSA0CgppbnQgZHBbMjAyMF1bMjAyMF07CmludCBjbnRbMjAyMF1bMjAyMF07CgppbnQgbW9kPTEwMDAwMDAwMDc7CmludCBtYWluKCl7CglUPXJlYWRJbnRMbigxLDEwMDApOwoJd2hpbGUoVC0tKXsKCQluPXJlYWRJbnRTcCgxLDIwMDApOwoJCW09cmVhZEludFNwKDEsMjAwMCk7CgkJcT1yZWFkSW50TG4oMSw1MDAwMDApOwoJCXNtX25tICs9IG4qbTsKCQlhc3NlcnQoc21fbm08PTEwMDAwMDAwKTsKCQlzbV9xICs9IHE7CgkJYXNzZXJ0KHNtX3E8PTUwMDAwMCk7CgkJZm9yKGludCBpPTA7aTxxO2krKyl7CgkJCWFycltpXS5yMSA9IHJlYWRJbnRTcCgxLG4pOwoJCQlhcnJbaV0uYzEgPSByZWFkSW50U3AoMSxtKTsKCQkJYXJyW2ldLnIyID0gcmVhZEludFNwKDEsbik7CgkJCWFycltpXS5jMiA9IHJlYWRJbnRMbigxLG0pOwoJCX0KCQlmb3IoaW50IGk9MTtpPD1uO2krKyl7CgkJCWZvcihpbnQgaj0xO2o8PW07aisrKXsKCQkJCWRvd25baV1bal0gPSBsZnRbaV1bal0gPSAtMTsKCQkJfQoJCX0KCQlzb3J0KGFycixhcnIrcSxjb21wKTsKCQlidWlsZCgxLDEsbSk7CgkJZm9yKGludCBpPTA7aTxxO2krKyl7CgkJCWlmKGFycltpXS5jMSA9PSBhcnJbaV0uYzIgfHwgYXJyW2ldLnIxID09IGFycltpXS5yMiljb250aW51ZTsKCQkJcGFpcjxpbnQsaW50PiBoID0gcXVlcnkoMSwxLG0sYXJyW2ldLmMxKzEsYXJyW2ldLmMyKTsKCQkJd2hpbGUoaC5maXJzdCA8PSBhcnJbaV0ucjIpewoJCQkJZm9yKGludCBqID0gbWF4KGguZmlyc3QsYXJyW2ldLnIxKzEpO2o8PWFycltpXS5yMjtqKyspewoJCQkJCWRvd25bal1baC5zZWNvbmRdID0gYXJyW2ldLnIxOwoJCQkJfQoJCQkJdXBkYXRlKDEsMSxtLGguc2Vjb25kLGFycltpXS5yMisxKTsKCQkJCWggPSBxdWVyeSgxLDEsbSxhcnJbaV0uYzErMSxhcnJbaV0uYzIpOwoJCQl9CgkJfQoJCS8qZm9yKGludCBpPTE7aTw9bjtpKyspewoJCQlmb3IoaW50IGo9MTtqPD1tO2orKyl7CgkJCQljb3V0PDxkb3duW2ldW2pdPDwiICI7CgkJCX0KCQkJY291dDw8ZW5kbDsKCQl9CgkJd2hpbGUoMSk7Ki8KCQlzb3J0KGFycixhcnIrcSxjb21wMik7CgkJYnVpbGQoMSwxLG4pOwoJCWZvcihpbnQgaT0wO2k8cTtpKyspewoJCQlpZihhcnJbaV0uYzEgPT0gYXJyW2ldLmMyIHx8IGFycltpXS5yMSA9PSBhcnJbaV0ucjIpY29udGludWU7CgkJCXBhaXI8aW50LGludD4gaCA9IHF1ZXJ5KDEsMSxuLGFycltpXS5yMSsxLGFycltpXS5yMik7CgkJCXdoaWxlKGguZmlyc3QgPD0gYXJyW2ldLmMyKXsKCQkJCWZvcihpbnQgaiA9IG1heChoLmZpcnN0LGFycltpXS5jMSsxKTtqPD1hcnJbaV0uYzI7aisrKXsKCQkJCQlsZnRbaC5zZWNvbmRdW2pdID0gYXJyW2ldLmMxOwoJCQkJfQoJCQkJdXBkYXRlKDEsMSxuLGguc2Vjb25kLGFycltpXS5jMisxKTsKCQkJCWggPSBxdWVyeSgxLDEsbixhcnJbaV0ucjErMSxhcnJbaV0ucjIpOwoJCQl9CgkJfQoJCWludCBzb2wgPSAwOwoJCWludCBjbyA9IDA7CgkJZm9yKGludCBpPTE7aTw9bjtpKyspewoJCQlmb3IoaW50IGo9MTtqPD1tO2orKyl7CgkJCQlkcFtpXVtqXSA9IDE7CgkJCQljbnRbaV1bal0gPSAxOwoJCQkJaWYgKCBkb3duW2ldW2pdICE9IC0xKQoJCQkJZm9yKGludCBrPWRvd25baV1bal0gOyBrPD1pLTI7aysrKXsKCQkJCQlpZihkcFtrXVtqLTFdICsgMSA+IGRwW2ldW2pdICl7CgkJCQkJCWRwW2ldW2pdID0gZHBba11bai0xXSArIDE7CgkJCQkJCWNudFtpXVtqXSA9IGNudFtrXVtqLTFdOwoJCQkJCX0gZWxzZSBpZihkcFtrXVtqLTFdICsgMSA9PSBkcFtpXVtqXSApewoJCQkJCQljbnRbaV1bal0gKz0gY250W2tdW2otMV07CgkJCQkJCWNudFtpXVtqXSAlPSBtb2Q7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCBsZnRbaV1bal0gIT0gLTEpCgkJCQlmb3IoaW50IGs9bGZ0W2ldW2pdIDsgazw9ai0xO2srKyl7CgkJCQkJaWYoZHBbaS0xXVtrXSArIDEgPiBkcFtpXVtqXSApewoJCQkJCQlkcFtpXVtqXSA9IGRwW2ktMV1ba10gKyAxOwoJCQkJCQljbnRbaV1bal0gPSBjbnRbaS0xXVtrXTsKCQkJCQl9IGVsc2UgaWYoZHBbaS0xXVtrXSArIDEgPT0gZHBbaV1bal0gKXsKCQkJCQkJY250W2ldW2pdICs9IGNudFtpLTFdW2tdOwoJCQkJCQljbnRbaV1bal0gJT0gbW9kOwoJCQkJCX0KCQkJCX0KCQkJCWlmKGRwW2ldW2pdICA+IHNvbCApewoJCQkJCXNvbCA9IGRwW2ldW2pdOwoJCQkJCWNvID0gY250W2ldW2pdOwoJCQkJfSBlbHNlIGlmIChkcFtpXVtqXSAgPT0gc29sKXsKCQkJCQljbyArPSBjbnRbaV1bal07CgkJCQkJY28gJT0gbW9kOwoJCQkJfQoJCQl9CgkJfQoJCWNvdXQ8PHNvbDw8IiAiPDxjbzw8ZW5kbDsKCX0KCWFzc2VydChnZXRjaGFyKCk9PS0xKTsKfQ==