//Zory-2019
#include<bits/stdc++.h>
using namespace std;
namespace mine
{
typedef long long ll;
#define pr pair<int,int>
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define GG(x) if(x) {puts("error");exit(666);}
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
ll qread()
{
ll ans=0,f=1;char c=getchar();
while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
return ans*f;
}
void write(ll num)
{
if(num<0) putchar('-'),num=-num;
if(num>=10) write(num/10);
putchar('0'+num%10);
}
void write1(ll num){write(num);putchar(' ');}
void write2(ll num){write(num);putchar('\n');}
template<typename T> void chmax(T &x,const T y) {x=(x>y?x:y);}
template<typename T> void chmin(T &x,const T y) {x=(x<y?x:y);}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
const int INF=0x3f3f3f3f;
const int MOD=998244353;
int mm(const int x){return x>=MOD?x-MOD:x;}
template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
ll qpower(ll x,ll e,int mod=MOD){ll ans=1;GG(e<0)while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
ll invm(ll x){return qpower(x,MOD-2);}
const int N=5e4+10,T=256;
namespace Trie
{
int id=1,son[T*17][2];void clear(){fo(i,0,id)son[i][0]=son[i][1]=0;id=1;}
void insert(int num)
{
int now=1;
fd(i,15,0)
{
int wt=(num>>i)&1;
if(!son[now][wt]) son[now][wt]=++id;
now=son[now][wt];
}
}
int ask(int num)
{
int now=1,ans=0;
fd(i,15,0)
{
int wt=(num>>i)&1;wt^=1;
if(!son[now][wt]) wt^=1; else ans+=bin(i);
now=son[now][wt];
}
return ans;
}
};
int ff[N];vc<int> to[N];
int n,hh[N][N/T+1],a[N],dep[N],anc[N];//debug 忘记+1,原地暴毙
void pre(int x,int fa)
{
ff[x]=fa;dep[x]=dep[fa]+1;
Trie::clear();int now=x;
for(int dis=0;dis<T and now>0;dis++,now=ff[now]) Trie::insert(a[now]^dis);
anc[x]=now;
fo(t,0,n/T) hh[x][t]=Trie::ask(t*T);
for(auto y:to[x]) if(y!=fa) pre(y,x);
}
void main()
{
n=qread();int q=qread();fo(i,1,n) a[i]=qread();
fo(i,2,n) {int x=qread(),y=qread();to[x].PB(y);to[y].PB(x);}
pre(1,0);
while(q--)//x->y
{
int y=qread(),x=qread(),ans=a[y]^(dep[x]-dep[y]),z=x;
while(dep[z]-T+1>=dep[y]) chmax(ans,hh[z][(dep[x]-dep[z])/T]),z=anc[z];
while(dep[z]>=dep[y]) chmax(ans,a[z]^(dep[x]-dep[z])),z=ff[z];
write2(ans);
}
}
};//(ans+MOD)%MOD
signed main()
{
// freopen("a.in","r",stdin);
srand(time(0));
mine::main();
}