拜托了QAQ,真的找不到
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep2(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
const int N=2e5+5;
int a[N],b[N];
vector<int>E[N];
struct LinearBasis{
int p[32];
void clear(){
rep(i,0,30)
{
p[i]=0;
}
}
void ins(int k){
for(int i = 30; i >= 0; -- i){
if(!(k&(1<<i))) continue;
if(!p[i]) return p[i] = k, void();
k ^= p[i];
}
return;
}
void ins(LinearBasis x){
for(int i = 30; i >= 0; -- i)
ins(x.p[i]);
}
int getmx(){
int ans = 0;
for(int i = 30; i >= 0; -- i) ans = max(ans, ans^p[i]);
return ans;
}
}pre[N],suf[N],s[N];
int st[N],ed[N],dis[N],f[N][22];
int tot;
void init(int n){
tot=0;
rep(i,0,n+1)E[i].clear(),st[i]=0,ed[i]=0,pre[i].clear(),suf[i].clear(),s[i].clear(),dis[i]=0;
rep(i,0,n+1)rep(j,0,19)f[i][j]=i;
}
void dfs(int u,int fa){
f[u][0]=fa;
st[u]=++tot;
s[u].ins(a[u]);
b[tot]=a[u];
for(auto v:E[u]){
if(v==fa)continue;
dis[v]=dis[u]+1;
dfs(v,u);
s[u].ins(s[v]);
}
ed[u]=tot;
}
void solve(){
int n;
cin>>n;init(n);
rep(i,1,n){
cin>>a[i];
}
rep(i,1,n-1){
int u,v;cin>>u>>v;E[u].pb(v);E[v].pb(u);
}
dfs(1,-1);f[1][0]=1;
rep(i,1,n){
pre[i].ins(pre[i-1]);
pre[i].ins(b[i]);
}
rep(i,1,n){
suf[i].ins(b[i]);
suf[i].ins(suf[i+1]);
}
rep(k,1,19){
rep(i,1,n){
f[i][k]=f[f[i][k-1]][k-1];
}
}
int q;cin>>q;
while(q--){
int r,v;cin>>r>>v;
if(r==v){
printf("%d\n",pre[n].getmx());
}
else{
if(dis[r]<=dis[v]){
printf("%d\n",s[v].getmx());
}
else{
int nw=r,d=dis[r]-dis[v]-1;
while(d>0){
rep2(i,19,0){
if(d>=(1<<i)){
d-=(1<<i);
nw=f[nw][i];
}
}
}
if(f[nw][0]==v){
LinearBasis ans;ans=pre[st[nw]-1];
ans.ins(suf[ed[nw]+1]);
printf("%d\n",ans.getmx());
}
else{
printf("%d\n",s[v].getmx());
}
}
}
}
}
signed main() {
int T;
cin>>T;
while(T--){
solve();
}
return 0;
}