全RE,能输出一部分,到某个询问RE,Orz
查看原帖
全RE,能输出一部分,到某个询问RE,Orz
280866
我是Andy楼主2022/12/30 17:40
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0; char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x;
}
const int N=1e5+5000;
int n,m,tot,cnt,ans,nrk;
struct TREE{
	int l,r,sum;
}t[32*N];
int T[N],h[N],a[N],rk[N],fa[N][28],dep[N];
struct edge{
	int v,nxt;
}e[2*N];
void add(int u,int v){
	e[++tot].nxt=h[u];
	e[tot].v=v;
	h[u]=tot;
}
int LCA(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=25;i>=0;i--){
		if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
	}
	if(u==v) return u;
	for(int i=25;i>=0;i--)
		if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
	return fa[u][0];
}
int build(int l,int r){
	int rt=++cnt;
	if(l<r){
		int mid=(l+r)>>1;
		t[rt].l=build(l,mid);
		t[rt].r=build(mid+1,r);
	}
	return rt;
}
int update(int pre,int l,int r,int val){
	int rt=++cnt;
	t[rt].l=t[pre].l,t[rt].r=t[pre].r,t[rt].sum=t[pre].sum+1;
	if(l<r){
		int mid=(l+r)>>1;
		if(val<=mid) t[rt].l=update(t[pre].l,l,mid,val);
		else t[rt].r=update(t[pre].r,mid+1,r,val);
	}
	return rt;
}
void init(){
	sort(a+1,a+n+1);
	nrk=n;
	n=unique(a+1,a+nrk+1)-a-1;
	T[0]=build(1,n);
	for(int i=1;i<=nrk;i++){
		rk[i]=lower_bound(a+1,a+n+1,rk[i])-a;
	}
}
void dfs(int u){
	for(int i=h[u];i!=0;i=e[i].nxt){
		int v=e[i].v;
		if(v==fa[u][0]) continue ;
		dep[v]=dep[u]+1;
		fa[v][0]=u;
		T[v]=update(T[u],1,n,rk[v]);
		dfs(v);
	}
}
int sum(int u,int v,int f,int ff,int l,int r,int k){
	if(l==r) return l;
	int x=t[t[u].l].sum+t[t[v].l].sum-t[t[f].l].sum-t[t[ff].l].sum;
	int mid=(l+r)>>1;
	if(x>=k) return sum(t[u].l,t[v].l,t[f].l,t[ff].l,l,mid,k);
	else return sum(t[u].r,t[v].r,t[f].r,t[ff].r,mid+1,r,k-x);
}
signed main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++) rk[i]=read(),a[i]=rk[i];
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v);
		add(v,u);
	}
	init();
	dep[1]=1;
	dfs(1);
	for(int j=1;j<=25;j++){
		for(int i=1;i<=nrk;i++){
			fa[i][j]=fa[fa[i][j-1]][j-1];
		}
	}
	int last=0;
	while(m--){
		int x=read(),y=read(),k=read();
		x=x^last;
		int lca=LCA(x,y);
		ans=sum(T[x],T[y],T[lca],T[fa[lca][0]],1,n,k);
		cout<<a[ans]<<endl;
		last=a[ans];
	}
	return 0;
}
/*
8 6
105 2 9 3 8 5 7 7
1 2
1 3
1 4
3 5
3 6
3 7
4 8
2 5 1
0 5 2
10 5 3
11 5 4
110 8 2
*/
2022/12/30 17:40
加载中...