#include<bits/stdc++.h>
using namespace std;
int n,m,Ca[500005],Q[100005],lim,k,dep[500005],t[500005],pos[500005],p[25],opp[500005];
string str[25];
void build(int rt){
p[dep[rt]]++;
if(dep[rt]==k){
t[rt]=p[k];
pos[p[k]]=rt;
return;
}
opp[rt]=str[dep[rt]][p[dep[rt]]-1]-'0';
dep[rt<<1]=dep[rt<<1|1]=dep[rt]+1;
build(rt<<1);
build(rt<<1|1);
return;
}
void init(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>Ca[i];
for(int i=1;i<=m;i++)cin>>Q[i];
lim=1,k=0;
while(lim<=n){
lim<<=1;
k++;
}
for(int i=k-1;i>=0;i--)cin>>str[i];
build(1);
}
int a[200005],f[400005],g[400005];
long long ans[400005];
void dfs1(int rt){
if(dep[rt]==k){
f[rt]=t[rt];
g[rt]=t[rt]-1;
return;
}
dfs1(rt<<1),dfs1(rt<<1|1);
if(!opp[rt]){
if(a[f[rt<<1]]>=k-dep[rt]){
f[rt]=f[rt<<1];
g[rt]=g[rt<<1];
}else{
f[rt]=f[rt<<1|1];
g[rt]=g[rt<<1|1];
}
g[rt]=max(g[rt],g[rt<<1]);
}else{
if(a[f[rt<<1|1]]>=k-dep[rt]){
f[rt]=f[rt<<1|1];
g[rt]=g[rt<<1|1];
}else{
f[rt]=f[rt<<1];
g[rt]=g[rt<<1];
}
g[rt]=max(g[rt],g[rt<<1|1]);
}
return ;
}
void add(int l,int r,int val){
if(l>r)return;
ans[l]+=val;
ans[r+1]-=val;
}
void dfs2(int rt,int L,int R,int r,int mx){
if(r<L)return;
if(dep[rt]==k){
int p=t[rt];
if(p<=n&&a[p]>=mx){
add(max(L,p),min(R,r),p);
}
add(L,min(r,p-1),p);
return;
}
if(!opp[rt]){
dfs2(rt<<1,L,R,r,max(mx,k-dep[rt]));
dfs2(rt<<1|1,L,R,(a[f[rt<<1]]>=k-dep[rt])? min(r,g[rt<<1]):r,mx);
}else{
dfs2(rt<<1,L,R,(a[f[rt<<1|1]]>=k-dep[rt])? min(r,g[rt<<1|1]):r,mx);
dfs2(rt<<1|1,L,R,r,max(mx,k-dep[rt]));
}
}
void work(){
int X[5];
cin>>X[0]>>X[1]>>X[2]>>X[3];
for(int i=1;i<=lim;i++)ans[i]=0;
for(int i=1;i<=n;i++)a[i]=Ca[i]^X[i%4];
for(int i=n+1;i<=lim;i++)a[i]=0x3f3f3f3f;
dfs1(1);
add(1,1,1);
int d=0,rt=1;
while(rt<=(lim>>1)){
dfs2(rt,(1<<(k-d-1))+1,1<<(k-d),0x3f3f3f3f,0);
rt<<=1;
d++;
}
long long sum=0;
for(int i=1;i<=n;i++)ans[i]+=ans[i-1];
for(int i=1;i<=m;i++)sum^=i*ans[Q[i]];
cout<<sum<<"\n";
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
init();
int T;
cin>>T;
while(T--){
work();
}
return 0;
}