#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
#define int long long
const int N=2e4+10;
struct node{
short to;
node *nxt;
};
node *ssh[N];
void add(short u,short v){
node *ne=new node;
ne->to=v;
ne->nxt=ssh[u];
ssh[u]=ne;
}
struct ccf{
bool vsv;
int val;
}ans[N][18][62],tmp[62];
short st[N][18];
int vv[N];
short dep[N];
inline void dfs(register short x,register short last){
dep[x]=dep[last]+1;
st[x][0]=last;
long long xh=vv[x];
for(register short i=60;i>=0;i--){
if(xh&(1ll<<((long long)(i)))){
if(!ans[x][0][i].vsv){
ans[x][0][i].vsv=true;
ans[x][0][i].val=xh;
break;
}else{
xh^=ans[x][0][i].val;
}
}
}
if(last){
xh=vv[last];
for(register short i=60;i>=0;i--){
if(xh&(1ll<<((long long)(i)))){
if(!ans[x][0][i].vsv){
ans[x][0][i].vsv=true;
ans[x][0][i].val=xh;
break;
}else{
xh^=ans[x][0][i].val;
}
}
}
}
for(node *i=ssh[x];i!=NULL;i=i->nxt){
if(i->to==last) continue;
dfs(i->to,x);
}
}
int n,q;
inline void build(){
for(register short j=1;j<=17;j++){
for(register short i=1;i<=n;i++){
st[i][j]=st[st[i][j-1]][j-1];
for(register short t=0;t<=60;t++){
ans[i][j][t]=ans[i][j-1][t];
}
for(register short t1=0;t1<=60;t1++){
if(!ans[st[i][j-1]][j-1][t1].vsv) continue;
long long sb=ans[st[i][j-1]][j-1][t1].val;
for(short t2=60;t2>=0;t2--){
if(sb&(1ll<<(long long)(t2))){
if(!ans[i][j][t2].vsv){
ans[i][j][t2].vsv=true;
ans[i][j][t2].val=sb;
break;
}else{
sb^=ans[i][j][t2].val;
}
}
}
}
}
}
}
inline void ins(int x,int y){
for(register short i=0;i<=60;i++){
if(!ans[x][y][i].vsv) continue;
int sb=ans[x][y][i].val;
for(register short j=60;j>=0;j--){
if(sb&(1ll<<(long long)(j))){
if(!tmp[j].vsv){
tmp[j].vsv=true;
tmp[j].val=sb;
break;
}else{
sb^=tmp[j].val;
}
}
}
}
}
inline int ask(int x,int y){
if(x==y) return vv[x];
for(register short i=0;i<=60;i++){
tmp[i]={false,0};
}
if(dep[x]<dep[y]) swap(x,y);
for(register short j=17;j>=0;j--){
if(dep[st[x][j]]>=dep[y]){
ins(x,j);
x=st[x][j];
}
}
if(x!=y){
for(register short j=17;j>=0;j--){
if(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);
}
long long zyh=0;
for(register short i=60;i>=0;i--){
if((zyh^tmp[i].val)>zyh) zyh^=tmp[i].val;
}
return zyh;
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>q;
for(register short i=1;i<=n;i++){
cin>>vv[i];
}
for(register short i=1;i<n;i++){
register short xx,yy;
cin>>xx>>yy;
add(xx,yy);
add(yy,xx);
}
dfs(1,0);
for(register short i=1;i<=n;i++){
while(ssh[i]!=NULL){
node *tt=ssh[i];
ssh[i]=ssh[i]->nxt;
delete tt;
}
delete ssh[i];
}
build();
while(q--){
register short xx,yy;
cin>>xx>>yy;
cout<<ask(xx,yy)<<'\n';
}
return 0;
}