#include<bits/stdc++.h>
using namespace std;
#define N 10005
int a[N],n,k,q;
struct LB{
int b[35];
LB(){memset(b,0,sizeof b);}
int check(int x){
for(int i=29;i>=0;i--)if(x>>i & 1){
if(!b[i])return 0;
x^=b[i];
}
return 1;
}
void insert(int x){
for(int i=29;i>=0;i--)if(x>>i & 1){
if(!b[i]){b[i]=x;return;}
x^=b[i];
}
}
int query_max(){
int res=0;
for(int i=29;i>=0;i--)
res=max(res,res^b[i]);
return res;
}
};
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
LB seg[N<<2];
LB merge(LB A,LB B){
LB res;
for(int i=29;i>=0;i--)
res.b[i]=A.b[i];
for(int i=29;i>=0;i--)
if(B.b[i])
res.insert(B.b[i]);
return res;
}
void build(int l,int r,int rt){
if(l==r){
seg[rt].insert(a[l]);
return;
}
int m=l+r>>1;
build(lson);build(rson);
seg[rt]=merge(seg[rt<<1],seg[rt<<1|1]);
}
LB query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)return seg[rt];
int m=l+r>>1;
LB res;
if(L<=m)res=merge(res,query(L,R,lson));
if(R>m)res=merge(res,query(L,R,rson));
return res;
}
void init(){
}
int main(){
int t;cin>>t;while(t--){
cin>>n>>q>>k;
for(int i=1;i<=n;i++){
/*k的存在会对求线性基最大值时的主元产生影响,所以预处理,a[i]只保留k没有的位*/
scanf("%d",&a[i]);
for(int j=0;j<30;j++)
if((k>>j & 1) && (a[i]>>j & 1))
a[i]^=(1<<j);
}
build(1,n,1);
while(q--){
int L,R;scanf("%d%d",&L,&R);
LB res=query(L,R,1,n,1);
cout<<(res.query_max()|k)<<'\n';
}
}
}