比赛 |
2025.3.29 |
评测结果 |
AAAAAAAAAA |
题目名称 |
幸运数字 |
最终得分 |
100 |
用户昵称 |
zqy |
运行时间 |
9.701 s |
代码语言 |
C++ |
内存使用 |
119.54 MiB |
提交时间 |
2025-03-29 09:35:31 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=2e4+10;
struct DS{
ll f[64];
void reset(){
memset(f,0,sizeof(f));
}
void insert(ll x){
for(int i=60;i>=0;i--){
if((x>>i)&1){
if(f[i])x^=f[i];
else{f[i]=x;break;}
}
if(!x)break;
}
return;
}
ll ask(){
ll x=0;
for(int i=60;i>=0;i--){
if((x^f[i])>x)x^=f[i];
}
return x;
}
}g[N][16],C,val;
DS operator + (const DS &A,const DS &B){
C=A;
for(int i=60;i>=0;i--)if(B.f[i])C.insert(B.f[i]);
return C;
}
int f[N][16],n,m,de[N];
vector<int>G[N];
ll v[N];
void add(int x,int y){
G[x].push_back(y);
}
void dfs(int x,int fa){
de[x]=de[fa]+1,f[x][0]=fa;
g[x][0].insert(v[x]);
for(int i=1;i<=15;i++)f[x][i]=f[f[x][i-1]][i-1];
for(int i=1;i<=15;i++)g[x][i]=g[x][i-1]+g[f[x][i-1]][i-1];
for(auto y:G[x]){
if(y==fa)continue;
dfs(y,x);
}
return;
}
ll ask(int a,int b){
val.reset();
if(de[a]<de[b])swap(a,b);
for(int i=15;i>=0;i--){
if(de[f[a][i]]>=de[b]){
val=val+g[a][i];
a=f[a][i];
}
}
if(a==b){
val.insert(v[a]);
return val.ask();
}
for(int i=15;i>=0;i--){
if(f[a][i]!=f[b][i]){
val=val+g[a][i]+g[b][i];
a=f[a][i],b=f[b][i];
}
}
val.insert(v[a]);
val.insert(v[b]);
val.insert(v[f[a][0]]);
return val.ask();
}
int main(){
freopen("luckynum.in","r",stdin);
freopen("luckynum.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",v+i);
for(int i=1,u,v;i<n;i++){
scanf("%d %d",&u,&v);
add(u,v),add(v,u);
}
dfs(1,0);
int x,y;
while(m--){
scanf("%d %d",&x,&y);
printf("%lld\n",ask(x,y));
}
return 0;
}