#include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 1;   const int size = 1 << 8, M = 1e6 + 10;   int n, q, w[N], head[N], ne[N], cnt;   void add(int f, int t) {     w[++cnt] = t;     ne[cnt] = head[f];     head[f] = cnt;   }   int fa[N], a[N], h[N];   void dfs(int x) {     for (int i = head[x]; i; i = ne[i]) {       int v = w[i];       if (fa[v]) continue;       fa[v] = x;       h[v] = h[x] + 1;       dfs(v);     }   }   int ance[N], go[M][2], id, dp[N][size];   void trie(int x) {     for (int i = 15, p = 1; i >= 0; i--) {       int w = x >> i & 1;       if (!go[p][w]) go[p][w] = ++id;       p = go[p][w];     }   }   int query(int x) {     int ans = 0;     for (int i = 15, p = 1; i >= 0; i--) {       int w = x >> i & 1;       if (go[p][w ^ 1])         ans |= (1 << i), p = go[p][w ^ 1];       else         p = go[p][w];     }     return ans;   }   int main() {     scanf( %d%d , &n, &q);     for (int i = 1; i <= n; ++i) scanf( %d , &a[i]);     for (int i = 1; i < n; ++i) {       int u, v;       scanf( %d%d , &u, &v);       add(u, v);       add(v, u);     }     fa[1] = h[1] = 1;     dfs(1);     fa[1] = 0;     for (int i = 1; i <= n; ++i) {       for (; id; id--) go[id][0] = go[id][1] = 0;       id = 1;       int p = i;       for (int j = 0; p && j < size; j++, p = fa[p]) trie(a[p] ^ (h[i] - h[p]));       ance[i] = p;       for (int j = 0; j < size; j++) dp[i][j] = query(j << 8);     }     for (int i = 1; i <= q; ++i) {       int u, v;       scanf( %d%d , &u, &v);       int p = v, dep = 0, ans = 0;       for (; h[p] - size >= h[u]; p = ance[p], dep++) ans = max(ans, dp[p][dep]);       for (; h[p] >= h[u]; p = fa[p]) ans = max(ans, a[p] ^ (h[v] - h[p]));       printf( %d n , ans);     }     return 0;   }   