rt,求调 20pts
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200005;
int n,q;
int G[N];
vector<int> vec[N];
int fa[N][20],dep[N];
struct Node {
int base[65],pos[65];
void clear() {memset(base,0,sizeof(base));memset(pos,0,sizeof(pos));}
void insert(int p) {
int x=G[p];
for(int i=60;i>=0;--i) {
if(!(x&(1<<i))) continue;
if(!base[i]) {
base[i]=x;pos[i]=p;
break;
}
if(dep[p]>dep[pos[i]]) {swap(pos[i],p);swap(x,base[i]);}
x^=base[i];
}
}
int gmax(int x) {
for(int i=60;i>=0;--i)
if((x^base[i])>x) x^=base[i];
return x;
}
}arr[N];
void dfs(int u,int father) {
fa[u][0]=father,dep[u]=dep[father]+1;
for(int i=0;i<=60;++i)
arr[u].pos[i]=arr[father].pos[i],arr[u].base[i]=arr[father].base[i];
arr[u].insert(u);
for(int i=1;i<20;++i) fa[u][i]=fa[fa[u][i-1]][i-1];
for(auto v:vec[u]) if(v!=father) {
dfs(v,u);
}
}
int lca(int u,int v) {
if(dep[u]<dep[v]) swap(u,v);
for(int i=19;~i;--i)
if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
if(u==v) return u;
for(int i=19;~i;--i)
if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
return fa[u][0];
}
signed main() {
cin >> n >> q;
for(int i=1;i<=n;++i) cin >> G[i];
int u,v;
for(int i=1;i<n;++i) {
cin >> u >> v;
vec[u].push_back(v);
vec[v].push_back(u);
}
dfs(1,0);
int LCA;Node node;
for(int i=1;i<=q;++i) {
cin >> u >> v;
LCA=lca(u,v);
node.clear();
for(int i=0;i<=60;++i) {
if(dep[arr[u].pos[i]]>=dep[LCA])
node.insert(arr[u].pos[i]);
if(dep[arr[v].pos[i]]>=dep[LCA])
node.insert(arr[v].pos[i]);
}
cout << node.gmax(0) << endl;
}
return 0;
}