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