#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 5e5 + 5;
typedef struct Card{
int v = 1;
friend bool operator < (Card a,Card b){
return a.v > b.v;
}
}Card;
Card card[MAXN];
int c[MAXN],f[MAXN];
int T,n,m,k,cnt,cnt2,cnt3;
int main(){
scanf("%d",&T);
while(T--){
int ans = 0;
cnt = 0,cnt2 = 0,cnt3 = 0;
for(int i = 1; i <= n; i++){
f[i] = 1;
}
scanf("%d%d%d",&n,&m,&k);
int l = 1;
for(int i = 1; i <= n; i++){
scanf("%d",&c[i]);
}
for(int i = 1; i <= n; i++){
int j = i;
while(j <= n && !(c[i] ^ c[j])){
j++;
}
f[++cnt] = j - i;
i = j - 1;
}
l = 1;
for(int i = 1; i <= cnt; i++){
if(!(f[i] % 2)){
cnt3++;
}
card[++cnt2].v = f[i];
l = i;
}
int cmd = 0;
for(int i = 1; i <= cnt2; i++){
if(card[i].v & 1){
if(m - cmd <= 0){
break;
}
if(!(card[i].v ^ 1)){
ans++;
}
if(card[i].v > 2 && k > 2){
if(m - cmd - ((card[i].v - 1) >> 1) < 0){
continue;
}
ans += card[i].v;
cmd += ((card[i].v - 1) >> 1);
}
else{
continue;
}
}
else{
if(m - cmd <= 0){
break;
}
if(!(card[i].v ^ 1)){
ans++;
}
if(card[i].v > 2 && k > 2){
if(m - cmd - ((card[i].v - 1) >> 1) < 0){
continue;
}
ans += card[i].v - 1;
cmd += ((card[i].v - 1) >> 1);
}
else{
continue;
}
}
}
if(cmd < m){
if(cnt3 <= (m - cmd)){
ans += cnt3;
}
else{
ans += (m - cmd);
}
}
printf("%d\n",ans);
}
}