比赛 |
4043级2023省选练习赛2 |
评测结果 |
AAAAAAAAAA |
题目名称 |
幸运数字 |
最终得分 |
100 |
用户昵称 |
yrtiop |
运行时间 |
20.017 s |
代码语言 |
C++ |
内存使用 |
147.29 MiB |
提交时间 |
2023-03-06 19:33:11 |
显示代码纯文本
#include <bits/stdc++.h>
using i64 = long long;
#define pb emplace_back
const int maxn = 2e4 + 5;
const int maxm = 61;
const int N = 15;
std::vector<int> G[maxn];
int n,q,f[N][maxn],d[maxn],lg[maxn],MAXLOG;
i64 a[maxn];
struct node {
i64 d[maxm];
node() {
memset(d , 0 , sizeof(d));
}
void insert(i64 x) {
for(int i = MAXLOG;~ i;-- i)
if(x >> i & 1) {
if(d[i])
x ^= d[i];
else {
d[i] = x;
break ;
}
}
return ;
}
} sum[N][maxn],ans;
void merge(const node& p) {
for(int i = MAXLOG;~ i;-- i)
ans.insert(p.d[i]);
return ;
}
void dfs(int u,int fa) {
for(auto& v : G[u]) {
if(v == fa)
continue ;
d[v] = d[u] + 1;
f[0][v] = u;
sum[0][v].insert(a[v]);
for(int k = 1;k <= lg[d[v]];++ k) {
f[k][v] = f[k - 1][f[k - 1][v]];
sum[k][v] = sum[k - 1][v];
for(int p = MAXLOG;~ p;-- p)
sum[k][v].insert(sum[k - 1][f[k - 1][v]].d[p]);
}
dfs(v , u);
}
return ;
}
i64 solve() {
i64 res = 0;
for(int k = MAXLOG;~ k;-- k)
res = std::max(res , res ^ ans.d[k]);
return res;
}
i64 calc(int u,int v) {
memset(ans.d , 0 , sizeof(ans.d));
if(d[u] < d[v])
std::swap(u , v);
for(int k = lg[d[u]];~ k;-- k) {
if(d[u] - (1 << k) >= d[v])
merge(sum[k][u]),u = f[k][u];
if(u == v)
return merge(sum[0][u]),solve();
}
for(int k = lg[d[u]];~ k;-- k)
if(f[k][u] != f[k][v])
merge(sum[k][u]),merge(sum[k][v]),u = f[k][u],v = f[k][v];
merge(sum[0][f[0][u]]);
merge(sum[0][u]);
merge(sum[0][v]);
return solve();
}
int main() {
freopen("luckynum.in","r",stdin);
freopen("luckynum.out","w",stdout);
scanf("%d %d",&n,&q);
for(int i = 1;i <= n;++ i)
scanf("%lld",&a[i]),MAXLOG = std::max(MAXLOG , (int)std::log2(a[i]));
for(int i = 2;i <= n;++ i) {
int u,v;
scanf("%d %d",&u,&v);
G[u].pb(v);
G[v].pb(u);
lg[i] = lg[i >> 1] + 1;
}
sum[0][1].insert(a[1]);
dfs(1 , 0);
while(q --) {
int u,v;
scanf("%d %d",&u,&v);
printf("%lld\n",calc(u , v));
}
return 0;
}