rt,找了好久找不到错,方法是参考第一篇题解
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 lll;
#define pii pair<int ,int>
#define mkp make_pair
#define ft first
#define sd second
int n ,q;
const int N = 2e4 + 10 ,M = 70 ,P = 20;
struct Basis{
int pos[M];
ll basis[M];
Basis()
{
memset(pos ,0 ,sizeof(pos));
memset(basis ,0 ,sizeof(basis));
}
void insert(ll x ,int p)
{
for (int i = M - 1;i >= 0;i--)
{
if (!((x >> i) & 1))
continue;
if (!basis[i])
{
basis[i] = x;
pos[i] = p;
break;
}
if (p > pos[i])
swap(p ,pos[i]) ,swap(basis[i] ,x);
x ^= basis[i];
}
}
ll query(int l)
{
ll ret = 0;
for (int i = M - 1;i >= 0;i--)
if (pos[i] >= l)
ret = max(ret ,ret ^ basis[i]);
return ret;
}
};
Basis b[N];
vector<int> G[N];
ll a[N];
int dep[N] ,f[N][P];
void dfs(int u ,int pre)
{
dep[u] = dep[pre] + 1;
b[u] = b[pre];
b[u].insert(a[u] ,dep[u]);
f[u][0] = pre;
for (auto v : G[u])
if (v != pre)
dfs(v ,u);
}
void init()
{
for (int i = 1;i < P;i++)
for (int j = 1;j <= n;j++)
f[j][i] = f[f[j][i - 1]][i - 1];
}
int LCA(int x ,int y)
{
if (dep[x] < dep[y])
swap(x ,y);
for (int i = P - 1;i >= 0;i--)
if (dep[f[x][i]] >= dep[y])
x = f[x][i];
if (x == y)
return x;
for (int i = P - 1;i >= 0;i--)
if (f[x][i] != f[y][i])
x = f[x][i] ,y = f[y][i];
return f[x][0];
}
int main()
{
scanf("%d%d",&n ,&q);
for (int i = 1;i <= n;i++)
scanf("%lld",&a[i]);
for (int i = 1;i < n;i++)
{
int x ,y;
scanf("%d%d",&x ,&y);
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1 ,0);
init();
while (q--)
{
int x ,y;
scanf("%d%d",&x ,&y);
int lca = LCA(x ,y);
// printf("%d\n",lca);
Basis bas;
for (int i = M - 1;i >= 0;i--)
{
if (b[x].pos[i] >= dep[lca])
bas.insert(b[x].basis[i] ,1);
if (b[y].pos[i] >= dep[lca])
bas.insert(b[y].basis[i] ,1);
}
printf("%lld\n",bas.query(0));
}
return 0;
}