#include <bits/stdc++.h>
#define int long long
const int MAXN = 120;
const int N = 100;
const int MOD = 2;
int n, m, q;
int add(int a, int b) { return (a + b > MOD) ? a + b - MOD : a + b; }
int mul(int a, int b) { return (a * b * 1ll) % MOD; }
int dec(int a, int b) { return (a - b < 0) ? a - b + MOD : a - b; }
void pluson(int& a, int b) { a = add(a, b); }
struct matrix {
int M[MAXN][MAXN];
void clear() {
memset(M, 0, sizeof M);
}
void reset() {
clear();
for (int i = 1; i <= N; i++) M[i][i] = 1;
}
} ;
matrix operator * (const matrix& a, const matrix& b) {
matrix ans;
ans.clear();
for (int i = 1; i <= n; i++)
for (int k = 1; k <= n; k++)
for (int j = 1; j <= n; j++)
pluson(ans.M[i][j], mul(a.M[i][k], b.M[k][j]));
return ans;
}
matrix quickpow(matrix p, int c) {
matrix ans;
ans.reset();
while (c) {
if (c & 1) ans = ans * p;
p = p * p;
c >>= 1;
}
return ans;
}
matrix f, base;
matrix pows[33];
void init()
{
pows[0] = base;
for (int i = 1; i <= 32; i++) {
pows[i] = pows[i - 1] * pows[i - 1];
}
}
signed main()
{
freopen("P6569_2.in", "r", stdin);
freopen("my.out", "w", stdout);
scanf("%lld %lld %lld", &n, &m, &q);
f.clear(), base.clear();
for (int i = 1; i <= n; i++) {
int now;
scanf("%lld", &f.M[i][1]);
}
for (int i = 1; i <= m; i++) {
int u, v; scanf("%lld %lld", &u, &v);
base.M[u][v] = 1, base.M[v][u] = 1;
}
init();
for (int i = 1; i <= q; i++) {
int nowc; scanf("%lld", &nowc);
matrix nowp; nowp.reset();
for (int j = 32; j >= 0; j--) {
if ((nowc >> j) & 1) {
nowp = nowp * pows[j];
}
}
int ans = 0, fnow = 1;
for (int k = 1; k <= n; k++) {
ans ^= f.M[k][1] * nowp.M[1][k];
}
printf("%lld\n", ans);
}
return 0;
}