#include <bits/stdc++.h>   using namespace std;   const int N = 5e4 + 10, K = 256, B = 16;   int a[N], parent[N], depth[N], up[N], ans[N][K];   vector<int> g[N];   bitset<(1 << (B + 1)) + 10> trie;   void make_tries(int i, int par);   void trie_insert(int val);   void trie_clear(int val);   int trie_max(int val);   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     int n, q;     cin >> n >> q;     for (int i = 1; i <= n; ++i) {       cin >> a[i];     }     for (int i = 1; i < n; ++i) {       int u, v;       cin >> u >> v;       g[u].push_back(v);       g[v].push_back(u);     }     make_tries(1, 0);     while (q--) {       int u, v;       cin >> u >> v;       int dist = 0, res = 0;       while (depth[v] - depth[u] >= K - 1) {         res = max(res, ans[v][dist]);         v = up[v];         ++dist;       }       dist <<= 8;       while (depth[v] >= depth[u]) {         res = max(res, dist xor a[v]);         v = parent[v];         ++dist;       }       cout << res << endl;     }   }   void make_tries(int i, int par) {     parent[i] = par;     depth[i] = 1 + depth[par];     if (depth[i] >= K) {       int u = i;       int dist = 0;       while (depth[i] - depth[u] <= K - 1) {         trie_insert(dist xor a[u]);         u = parent[u];         ++dist;       }       for (int d = 0; d < K; ++d) {         ans[i][d] = trie_max(d << 8);       }       up[i] = u;       dist = 0;       u = i;       while (depth[i] - depth[u] <= K - 1) {         trie_clear(dist xor a[u]);         u = parent[u];         ++dist;       }     }     for (auto &j : g[i]) {       if (j != par) {         make_tries(j, i);       }     }   }   void trie_insert(int val) {     int pos = 1;     for (int b = B - 1; b >= 0; --b) {       pos = (pos << 1) | ((val & (1 << b)) >> b);       trie[pos] = 1;     }   }   void trie_clear(int val) {     int pos = 1;     for (int b = B - 1; b >= 0; --b) {       pos = (pos << 1) | ((val & (1 << b)) >> b);       trie[pos] = 0;     }   }   int trie_max(int val) {     int pos = 1, res = 0;     for (int b = B - 1; b >= 0; --b) {       pos = (pos << 1) | (((val & (1 << b)) >> b) ^ 1);       if (trie[pos]) {         res |= (1 << b);       } else {         pos ^= 1;       }     }     return res;   }   