#include<iostream>
#include<cstring>
using namespace std;
const int N=2e4+2;
const int INF=0x7fffffff;
struct node{
int to,nxt;
}edge[2*N];
int head[N];
int cnt;
inline void add(int u,int v){
edge[++cnt]={v,head[u]};
head[u]=cnt;
}
long long vv[N];
int dep[N];
struct ccf{
long long val;
bool vsv;
}ans[N][17][65],tmp[65];
int st[N][17];
inline void dfs(register int x,register int last){
st[x][0]=last;
dep[x]=dep[last]+1;
for(register int i=60;i>=0;i--){
if(vv[x]&(1ll<<(long long)(i))){
ans[x][0][i].val=vv[x];
ans[x][0][i].vsv=true;
break;
}
}
int xh=vv[last];
for(register int i=60;i>=0;i--){
if(xh&(1ll<<(long long)(i))){
if(ans[x][0][i].vsv==false){
ans[x][0][i].vsv=true;
ans[x][0][i].val=xh;
break;
}else{
xh^=ans[x][0][i].val;
}
}
}
for(register int i=head[x];i!=-1;i=edge[i].nxt){
if(edge[i].to!=last) dfs(edge[i].to,x);
}
}
int n,q;
inline void build(){
for(register int j=1;j<=16;j++){
for(register int i=1;i<=n;i++){
if(dep[i]<=(1<<j)) continue;
st[i][j]=st[st[i][j-1]][j-1];
for(register int t=0;t<=60;t++){
ans[i][j][t]=ans[i][j-1][t];
}
for(register int t=60;t>=0;t--){
long long sb=ans[st[i][j-1]][j-1][t].val;
for(register int tt=60;tt>=0;tt--){
if(sb&(1ll<<(long long)(tt))){
if(ans[i][j][tt].vsv==false){
ans[i][j][tt].vsv=true;
ans[i][j][tt].val=sb;
break;
}else{
sb^=ans[i][j][tt].val;
}
}
}
}
}
}
}
inline void ins(register int x,register int y){
for(register int i=0;i<=60;i++){
long long sb=ans[x][y][i].val;
for(register int j=60;j>=0;j--){
if(sb&(1ll<<(long long)(j))){
if(tmp[j].vsv==false){
tmp[j].val=sb;
tmp[j].vsv=true;
break;
}else{
sb^=tmp[j].val;
}
}
}
}
}
signed main(){
ios::sync_with_stdio(false);
memset(head,-1,sizeof(head));
cin>>n>>q;
for(register int i=1;i<=n;i++){
cin>>vv[i];
}
for(register int i=1;i<n;i++){
register int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
build();
while(q--){
for(register int i=0;i<=60;i++){
tmp[i]={0,false};
}
register int x,y;
cin>>x>>y;
if(x==y){
cout<<vv[x]<<'\n';
continue;
}
if(dep[x]<dep[y]) swap(x,y);
for(register int j=16;j>=0;j--){
if((1<<j)<=dep[x]&&dep[st[x][j]]>=dep[y]){
ins(x,j);
x=st[x][j];
}
}
if(x!=y){
for(register int j=16;j>=0;j--){
if((1<<j)<dep[x]&&st[x][j]!=st[y][j]){
ins(x,j);
ins(y,j);
x=st[x][j];
y=st[y][j];
}
}
ins(x,0);
ins(y,0);
}
register long long zyh=0;
for(register int i=60;i>=0;i--){
if((zyh^tmp[i].val)>zyh) zyh^=tmp[i].val;
}
cout<<zyh<<'\n';
}
return 0;
}