求调
查看原帖
求调
841638
Igunareo楼主2024/5/8 22:48
#include<bits/stdc++.h>
using namespace std;
int x[100005];
vector<int> way[100005];
struct edge{
	int l,r,val;
}y[2000000];
int top=0,num,n;
int father[100005][20];
int depth[100005];
int root[100005];
pair<int,int>x2[100005];
int z[100005],z2[100005];
int ans[100005];
int LCA(int a,int b){
	if(a==b)return a;
	for(int i=17;i>=0;i--){
		if(father[a][i]!=father[b][i]){
			a=father[a][i];
			b=father[b][i];
		}
	}
	return father[a][0];
}
int jump(int a,int b){
	int got=depth[a]-depth[b];
	for(int i=17;i>=0;i--)if(got&(1<<i))a=father[a][i];
	return a;
}
void up(int &now,int had,int l,int r,int a){
	if(!now)now=++top;//cout<<now<<' '<<had<<' '<<l<<' '<<r<<' '<<a<<endl;
	if(l==r&&l==a){
		y[now].val=y[had].val+1;
		return;
	}
	int mid=(l+r)/2;
	if(a<=mid){
		y[now].r=y[had].r;
		up(y[now].l,y[had].l,l,mid,a);
	}
	else{
		y[now].l=y[had].l;
		up(y[now].r,y[had].r,mid+1,r,a);
	}
	y[now].val=y[had].val+1;
	return;
}
void dfs(int now,int dep){
	up(root[now],root[father[now][0]],1,num,z[now]);
	for(int i=0;i<way[now].size();i++){
		if(way[now][i]!=father[now][0]){
			father[way[now][i]][0]=now;
			depth[way[now][i]]=dep+1;
			dfs(way[now][i],dep+1);
		}
	}
	return;
}
int down(int a,int b,int c,int d,int l,int r,int p){
	if(l==r)return l;
	int mid=(l+r)/2,left=y[y[a].l].val+y[y[b].l].val-y[y[c].l].val-y[y[d].l].val;
	if(p<=left)return down(y[a].l,y[b].l,y[c].l,y[d].l,l,mid,p);
	else return down(y[a].r,y[b].r,y[c].r,y[d].r,mid+1,r,p-left);
}
int main(){
	int m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&x[i]);
		x2[i].first=x[i];
		x2[i].second=i;
	}
	sort(x2+1,x2+n+1);
	for(int i=1;i<=n;i++){
		if(x2[i].first!=x2[i-1].first)z2[++num]=x2[i].first;
		z[x2[i].second]=num;
	}
	for(int i=1;i<n;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		way[a].push_back(b);
		way[b].push_back(a);
	}
	dfs(1,1);
	for(int i=1;i<=17;i++)for(int j=1;j<=n;j++)father[j][i]=father[father[j][i-1]][i-1];
	for(int i=1;i<=m;i++){
		int a,b,k;
		scanf("%d%d%d",&a,&b,&k);
		a=a^ans[i-1];
		int c,d;
		if(depth[a]>depth[b]){
			c=LCA(jump(a,b),b);
			d=father[c][0];
		}
		else{
			c=LCA(a,jump(b,a));
			d=father[c][0];
		}
		ans[i]=z2[down(root[a],root[b],root[c],root[d],1,num,k)];
	}
	for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
	return 0;
}
2024/5/8 22:48
加载中...