#include<iostream>
#include<string>
#include<algorithm>
#include<stack>
#include<math.h>
#include<map>
#include <unordered_map>
#include<vector>
#include<queue>
#include<set>
#include <bits/stdc++.h>
#include<deque>
#include<string>
#define N 40
#define K 100005
#define MOD 1e9+7
#define ll long long int
using namespace std;
ll max(ll a, ll b){
if(a>b)
return a;
return b;
}
ll min(ll a, ll b){
if(a<b)
return a;
return b;
}
const int ALPHABET_SIZE = 2;
struct TrieNode
{
struct TrieNode *children[ALPHABET_SIZE];
// isEndOfWord is true if the node represents
// end of a word
int index_of_no;
};
struct TrieNode *getNode(void)
{
struct TrieNode *pNode = new TrieNode;
pNode->index_of_no = 0;
for (int i = 0; i < ALPHABET_SIZE; i++)
pNode->children[i] = NULL;
return pNode;
}
void insert(struct TrieNode *root, string key, int pos)
{
struct TrieNode *pCrawl = root;
for (int i = 0; i < key.length(); i++)
{
int index = key[i] - '0';
if (!pCrawl->children[index])
pCrawl->children[index] = getNode();
pCrawl = pCrawl->children[index];
}
// mark last node as leaf
pCrawl->index_of_no = pos;
}
string get_32_bit(int val){
int lim = 32;
char bin[lim+1];
bin[lim] = '\0';
for(int i=0;i<lim;i++){
bin[i] = '0';
}
int i = 0;
while(val >0){
int rem = val%2;
bin[lim-1-i] = rem + '0';
i++;
val/=2;
}
return bin;
}
int search(struct TrieNode *root, string key)
{
struct TrieNode *pCrawl = root;
//cout<<key.length()<<endl;
for (int i = 0; i < key.length(); i++)
{
int index = key[i] - '0';
if(!pCrawl->children[index]){
if(pCrawl->children[0] != NULL){
pCrawl = pCrawl->children[0];
//cout<<i<<" 00"<<endl;
}
else if(pCrawl->children[1] != NULL){
pCrawl = pCrawl->children[1];
//cout<<i<<" 11"<<endl;
}
/*
else{
cout<<i<<" return from here"<<endl;
return pCrawl->index_of_no;
}*/
}
else{
pCrawl = pCrawl->children[index];
//cout<<i<<" match"<<endl;
}
}
return pCrawl->index_of_no;
}
string comple(string s){
char inv[33];
for(int i=0;i<s.length();i++){
if(s[i] == '0')
inv[i] = '1';
else
inv[i] = '0';
}
inv[32] = '\0';
return inv;
}
int main(){
int t;
cin>>t;
while(t--){
int n, q;
cin>>n>>q;
int x[q];
int nos[n];
for(int i=0;i<n;i++){
cin>>nos[i];
}
for(int i=0;i<q;i++){
cin>>x[i];
}
struct TrieNode *root = getNode();
for(int i=0;i<n;i++){
int val = nos[i];
string s = get_32_bit(val);
//cout<<i<<" "<<s<<endl;
insert(root, s, i+1);
}
string req;
for(int i=0;i<q;i++){
string pres = get_32_bit(x[i]);
string req = comple(pres);
//cout<<"$ "<<req<<endl;
int matching_pos = search(root, req);
cout<<matching_pos<<endl;
}
}
}