1
#include<cstdio>
2
#include<cstring>
3
#include<vector>
4
#include<algorithm>
5
#define
MAXN 160
6
#define
MAXM 20
7
#define
MAXL 280
8
using
namespace
std;
9
int
n,m;
10
bool
land[MAXN][MAXM];
11
int
put[MAXL][MAXM],cnt[MAXL],tmp[MAXM],size;
12
vector<
int
>
G[MAXL];
13
int
dp[
2
][MAXL][MAXL];
14
bool
OK()
15
{
16
int
i,j,k,res;
17
for
(i=res=
0
;i<m;i++
)
18
{
19
if
(tmp[i])
20
{
21
for
(j=i;j<m&&tmp[i]==tmp[j];j++
);
22
k=j-
i;
23
if
(tmp[i]==
1
)
24
{
25
if
(k%
3
)
26
return
false
;
27
res+=k/
3
;
28
}
29
else
30
{
31
if
(k&
1
)
32
return
false
;
33
res+=k>>
1
;
34
}
35
i=j-
1
;
36
}
37
}
38
cnt[size]=
res;
39
return
true
;
40
}
41
void
DFS(
int
now)
42
{
43
if
(now==
m)
44
{
45
if
(OK())
46
memcpy(put[size++],tmp,
sizeof
(tmp));
47
}
48
else
49
{
50
int
i;
51
for
(i=
0
;i<
3
;i++
)
52
{
53
tmp[now]=
i;
54
DFS(now+
1
);
55
}
56
}
57
}
58
bool
Upper(
int
x,
int
y)
59
{
60
int
i;
61
for
(i=
0
;i<m;i++
)
62
{
63
if
(put[x][i]&&
put[y][i])
64
return
false
;
65
}
66
return
true
;
67
}
68
void
Init()
69
{
70
int
i,j;
71
size=
0
;
72
memset(land,
false
,
sizeof
(land));
73
memset(dp,
0
,
sizeof
(dp));
74
DFS(
0
);
75
for
(i=
0
;i<size;i++
)
76
{
77
G[i].clear();
78
for
(j=
0
;j<size;j++
)
79
{
80
if
(Upper(i,j))
81
G[i].push_back(j);
82
}
83
}
84
}
85
bool
Unfit(
int
r,
int
x)
86
{
87
int
i;
88
for
(i=
0
;i<m;i++
)
89
{
90
if
(land[r][i]&&
put[x][i])
91
return
true
;
92
}
93
return
false
;
94
}
95
bool
First(
int
x)
96
{
97
int
i;
98
for
(i=
0
;i<m;i++
)
99
{
100
if
(put[x][i]==
2
||put[x][i]&&land[
1
][i])
101
return
true
;
102
}
103
return
false
;
104
}
105
bool
Three(
int
x,
int
y,
int
k)
106
{
107
int
i;
108
for
(i=
0
;i<m;i++
)
109
{
110
if
(put[x][i]==
2
)
111
{
112
if
(put[y][i]||
land[k][i])
113
return
true
;
114
}
115
}
116
return
false
;
117
}
118
void
DoIt()
119
{
120
int
i,j,k,t,x,y,ans;
121
for
(ans=i=
0
;i<size;i++
)
122
{
123
if
(Unfit(
2
,i)||
First(i))
124
continue
;
125
dp[
0
][i][
0
]=
cnt[i];
126
}
127
for
(i=
3
;i<=n;i++
)
128
{
129
for
(j=
0
;j<size;j++
)
130
{
131
if
(Unfit(i,j))
132
continue
;
133
for
(k=
0
;k<G[j].size();k++
)
134
{
135
x=
G[j][k];
136
if
(Unfit(i-
1
,x)||Unfit(i-
1
,j))
137
continue
;
138
for
(t=
0
;t<G[x].size();t++
)
139
{
140
y=
G[x][t];
141
if
(Unfit(i-
2
,y)||Unfit(i-
2
,x)||Three(j,y,i-
2
))
142
continue
;
143
dp[i&
1
][j][x]=max(dp[i&
1
][j][x],dp[(i-
1
)&
1
][x][y]+
cnt[j]);
144
}
145
ans=max(ans,dp[i&
1
][j][x]);
146
}
147
}
148
}
149
printf(
"
%d\n
"
,ans);
150
}
151
int
main()
152
{
153
int
c,q,x,y;
154
scanf(
"
%d
"
,&
c);
155
while
(c--
)
156
{
157
scanf(
"
%d%d%d
"
,&n,&m,&
q);
158
Init();
159
while
(q--
)
160
{
161
scanf(
"
%d%d
"
,&x,&
y);
162
land[x][y-
1
]=
true
;
163
}
164
DoIt();
165
}
166
return
0
;
167
}

