using namespace std;
vector<int>e[maxn];
int du[maxn];
int vis[maxn];
namespace IO {
const int MT = 100 * 1024 * 1024;
char IO_BUF[MT];
int IO_PTR, IO_SZ;
/// 要记得把这一行添加到main函数第一行!!!
void begin() {
IO_PTR = 0;
IO_SZ = fread (IO_BUF, 1, MT, stdin);
}
template<typename T>
inline bool scan_d (T & t) {
while (IO_PTR < IO_SZ && IO_BUF[IO_PTR] != '-' && (IO_BUF[IO_PTR] < '0' || IO_BUF[IO_PTR] > '9'))
IO_PTR ++;
if (IO_PTR >= IO_SZ) return false;
bool sgn = false;
if (IO_BUF[IO_PTR] == '-') sgn = true, IO_PTR ++;
for (t = 0; IO_PTR < IO_SZ && '0' <= IO_BUF[IO_PTR] && IO_BUF[IO_PTR] <= '9'; IO_PTR ++)
t = t * 10 + IO_BUF[IO_PTR] - '0';
if (sgn) t = -t;
return true;
}
inline bool scan_s (char s[]) {
while (IO_PTR < IO_SZ && (IO_BUF[IO_PTR] == ' ' || IO_BUF[IO_PTR] == '\n') ) IO_PTR ++;
if (IO_PTR >= IO_SZ) return false;
int len = 0;
while (IO_PTR < IO_SZ && IO_BUF[IO_PTR] != ' ' && IO_BUF[IO_PTR] != '\n')
s[len ++] = IO_BUF[IO_PTR], IO_PTR ++;
s[len] = '\0';
return true;
}
template<typename T>
void print(T x) {
static char s[33], *s1; s1 = s;
if (!x) *s1++ = '0';
if (x < 0) putchar('-'), x = -x;
while(x) *s1++ = (x % 10 + '0'), x /= 10;
while(s1-- != s) putchar(*s1);
}
template<typename T>
void println(T x) {
print(x); putchar('\n');
}
};
using namespace IO;
int main(){
// freopen("input.txt","r",stdin);
begin();
int t;
scan_d(t);
while(t--){
int n,k;
scan_d(n),scan_d(k);
for(int i=0;i<=n;i++) e[i].clear();
int ans=0;
mm(du,0),mm(vis,0);
for(int i=2;i<=n;i++){
int x;
scan_d(x);
e[x].push_back(i);
e[i].push_back(x);
du[i]++,du[x]++;
}
queue<int>q;
for(int i=1;i<=n;i++){
if(du[i]==1) q.push(i);
}
while(!q.empty()){
int x=q.front();
q.pop();
int len=e[x].size();
for(int i=0;i<len;i++){
int next=e[x][i];
if(!vis[x] && !vis[next]){
vis[x]=1;
vis[next]=1;
ans++;
}
du[next]--;
if(du[next]==1) q.push(next);
}
}
if(ans*2>=k) ans=(k+1)/2;
else ans+=k-ans*2;
printf("%d\n",ans);
}
return 0;
}