比赛 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;
}