#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
using u64 = unsigned long long;
namespace PTqwq {
const i64 inf = 2147483647;
int n, m, c[100010], D[20][131082], cnt[20];
i64 a[131082], val[131082];
i64 dfs(int l, int r, int k) {
if (l == r) {
return l;
}
int mid = (l + r) / 2;
int ls = dfs(l, mid, k - 1);
int rs = dfs(mid + 1, r, k - 1);
cnt[k] ++;
if (D[k][cnt[k]] == 0) {
if (val[ls] >= k) {
return ls;
} else {
return rs;
}
} else {
if (val[rs] >= k) {
return rs;
} else {
return ls;
}
}
}
i64 query(int pre) {
int k = 0;
while ((1 << k) < pre) k ++;
i64 sum = 0;
for (int i = 1; i <= (1 << k); ++ i) {
for (int j = 1; j <= (1 << k); ++ j) {
if (j <= pre) {
val[j] = a[j];
} else {
if (i == j) {
val[j] = inf;
} else {
val[j] = 0;
}
}
}
for (int j = 0; j <= k + 1; ++ j) cnt[j] = 0;
if (dfs(1, (1 << k), k) == i) {
sum += i64(i);
}
}
return sum;
}
void solve() {
i64 X[4];
cin >> X[0] >> X[1] >> X[2] >> X[3];
for (int i = 1; i <= n; ++ i) {
a[i] ^= X[i % 4];
}
i64 res = 0;
for (int i = 1; i <= m; ++ i) {
i64 x = query(c[i]);
res ^= (i64(i) * x);
}
cout << res << '\n';
for (int i = 1; i <= n; ++ i) {
a[i] ^= X[i % 4];
}
}
void Main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; ++ i) cin >> a[i];
for (int i = 1; i <= m; ++ i) cin >> c[i];
int k = 0;
while ((1 << k) < n) k ++;
for (int i = 1; i <= k; ++ i) {
string s;
cin >> s;
for (int j = 0; j < (1 << (k - i)); ++ j) {
D[i][j + 1] = s[j] - '0';
}
}
int _;
cin >> _;
while (_ --) {
solve();
}
}
}
int main() {
PTqwq::Main();
return 0;
}
为啥第三个点 wa 了/yiw