#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N=105;
bool a[34][N][N];//a[i][j][k]的值为true表示经过2^i天,从j到k有通路;false表示经过2^i天,从j到k无通路。
LL ans[N];
LL c[N];//储存初始值
LL n,m,q;
void mul(LL x)
{
LL sum[N];
memset(sum,0,sizeof sum);
for(LL i=1;i<=n;i++)
for(LL j=1;j<=n;j++)
if(a[x][i][j]) sum[j]^=ans[i];//经过2^x天,i到j有通路,异或
memcpy(ans,sum,sizeof sum);
}
void mulself(LL x)
{
for(LL i=1;i<=n;i++)
for(LL j=1;j<=n;j++)
for(LL k=1;k<=n;k++)//如果经过2^(i-1)天,i到k有通路,k到j有通路,则经过2^i天,i到j有通路
a[x][i][j]^=(a[x-1][i][k]&a[x-1][k][j]);//由于异或的原因,i到j无通路时,出现一条通路,则i到j有通路;i到j有通路时,出现一条通路,则i到j相当于无通路。
}
void solve(LL x)
{
LL sum=0;
while(x)//矩阵乘法基本运用
{
if(x&1) mul(sum);//第i^sum天
sum++;
x>>=1;
}
printf("%lld\n",ans[1]);//输出首都
}
int main()
{
LL x,y,z;
scanf("%lld%lld%lld",&n,&m,&q);
for(LL i=1;i<=n;i++) scanf("%lld",&c[i]);
for(LL i=1;i<=m;i++)
{
scanf("%lld%lld",&x,&y);
a[0][x][y]=1;//只过一天,x到y有一条通路。
a[0][y][x]=1;//只过一天,y到x有一条通路。
}
for(LL i=1;i<=31;i++) mulself(i);//处理第2^i天
for(int i=1;i<=q;i++)
{
scanf("%lld",&x);
memcpy(ans,c,sizeof c);//ans数组初始化
solve(x);
}
return 0;
}
%%%