RE前五个点,WA最后一个点,求调(玄关)
查看原帖
RE前五个点,WA最后一个点,求调(玄关)
1054528
Fa_Nanf1204楼主2024/6/30 21:54
#include<bits/stdc++.h>
#define ll long long
#define N int(1e5+5)
#define mid ((l+r)>>1)
using namespace std; 
struct node{
	int l,r,sum;
}tr[N<<6];
int root[N],a[N],n,q,top,b[N],m;
int fa[N][47],dep[N],lg[N];
int lastans;
vector<int> g[N];
int lca(int x,int y){
	if(dep[y]>dep[x]) swap(x,y);
	for(int i=lg[dep[x]];i>=0;i--){
		if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	}
	if(x==y) return x;
	for(int i=lg[dep[x]];i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
int clone(int id){
	top++;
	tr[top]=tr[id];
	tr[top].sum++;
	return top;
}
int build(int l,int r){
	int id=++top;
	if(l==r){
		return id;
	}
	tr[id].l=build(l,mid);
	tr[id].r=build(mid+1,r);
	return id;
}
int update(int l,int r,int x,int id){
	id=clone(id);
	if(l==r){
		return id;
	}
	if(x<=mid) tr[id].l=update(l,mid,x,tr[id].l);
	else tr[id].r=update(mid+1,r,x,tr[id].r);
	return id;
}
int query(int l,int r,int u,int v,int k,int lc,int f){
	if(l==r){
		return l;
	}
	int x=tr[tr[v].l].sum+tr[tr[u].l].sum-tr[tr[lc].l].sum-tr[tr[f].l].sum;
	if(x>=k) return query(l,mid,tr[u].l,tr[v].l,k,tr[lc].l,tr[f].l);
	else return query(mid+1,r,tr[u].r,tr[v].r,k-x,tr[lc].r,tr[f].r);
}
void dfs(int x,int f){
	root[x]=update(1,m,a[x],root[f]);
	fa[x][0]=f;
	for(int i=1;i<=lg[dep[x]];i++){
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	int len=g[x].size();
	for(int i=0;i<len;i++){
		if(g[x][i]==f) continue;
		dfs(g[x][i],x);
	}
}
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];
	sort(b+1,b+n+1);
	m=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(b+1,b+m+1,a[i])-b;
	}
	for(int i=2;i<=n;i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
		lg[i]=lg[i>>1]+1;
	} 
	root[0]=build(1,m);
	dfs(1,0);
	for(int i=1;i<=q;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		x=x^lastans;
		int lc=lca(x,y);
		lastans=b[query(1,m,root[x],root[y],z,lc,fa[lc][0])];
		printf("%d\n",lastans);
	}
	return 0;
}
2024/6/30 21:54
加载中...