萌新求救,80+WA1,调了一上午了!!
查看原帖
萌新求救,80+WA1,调了一上午了!!
147441
Godzilla楼主2021/6/16 12:12
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

#define LL long long
#define PR pair<int,int>
#define MP make_pair
#define LB long double

using namespace std;

const int kN=2e5+5;

struct Smt{
	int s[2],siz;
	#define Siz(p) T[p].siz
	#define Son(p,k) T[p].s[k]
}T[kN<<7];

int n,m,a[kN],b[kN],cnt;
int to[2*kN],nex[2*kN],head[kN],tot;
int f[kN][30],rt[kN],_2[30],dep[kN];

void Add(int u,int v){
	to[++tot]=v;nex[tot]=head[u];head[u]=tot;
}

void Modify(int l,int r,int k,int p1,int &p2){
	p2=++cnt;
	T[p2]=T[p1];
	if(l==r){
		Siz(p2)++;return;
	}
	int mid=(l+r)>>1;
	if(k<=mid){Modify(l,mid,k,Son(p1,0),Son(p2,0));}
	else{Modify(mid+1,r,k,Son(p1,1),Son(p2,1));}
	Siz(p2)=Siz(Son(p2,0))+Siz(Son(p2,1));
}

void Dfs(int x,int fa,int depth){
	f[x][0]=fa;dep[x]=depth;
	int k=lower_bound(b+1,b+1+n,a[x])-b;
	Modify(1,tot,k,rt[fa],rt[x]);
	for(int i=head[x];i;i=nex[i]){
		int ar=to[i];
		if(ar==fa){continue;}	
		Dfs(ar,x,depth+1);
	}
}

int Lca(int x,int y){
	if(dep[x]<dep[y]){swap(x,y);}
	for(int i=20;i>=0;--i){
		if(dep[x]-_2[i]>=dep[y]){
			x=f[x][i];
		}
	}
	if(x==y){return y;}
	for(int i=20;i>=0;--i){
		if(dep[x]>_2[i]&&f[x][i]!=f[y][i]){
			x=f[x][i];y=f[y][i];
		}
	}
	return f[x][0];
}

int Query(int l,int r,int k,int p1,int p2,int p3,int p4){
	if(l==r){
		return l;
	}
	int mid=(l+r)>>1,sum=Siz(Son(p1,0))+Siz(Son(p2,0))-Siz(Son(p3,0))-Siz(Son(p4,0));
	if(k<=sum){return Query(l,mid,k,Son(p1,0),Son(p2,0),Son(p3,0),Son(p4,0));}
	else{return Query(mid+1,r,k-sum,Son(p1,1),Son(p2,1),Son(p3,1),Son(p4,1));}
}

signed main(){
//	freopen("2.in","r",stdin);
//	freopen("2.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
		b[i]=a[i];
	}
	for(int i=1;i<n;++i){
		int u,v;scanf("%d%d",&u,&v);
		Add(u,v);Add(v,u);
	}
	sort(b+1,b+1+n);
	tot=unique(b+1,b+1+n)-(b+1);
	Dfs(1,0,1);
	_2[0]=1;
	for(int i=1;i<=25;++i){_2[i]=_2[i-1]*2;}
	for(int i=1;i<=20;++i){
		for(int j=1;j<=n;++j){
			if(dep[j]-_2[i]<=0){continue;}
			f[j][i]=f[f[j][i-1]][i-1];
		}
	}
	int last=0;
	while(m--){
		int u,v,k;
		scanf("%d%d%d",&u,&v,&k);
		u=u^last;
		int lca=Lca(u,v);
		last=b[Query(1,tot,k,rt[u],rt[v],rt[lca],rt[f[lca][0]])];
		printf("%d\n",last);
	}
	return 0;
}
/*
8 5
105 2 9 3 8 5 7 7
1 2
1 3
1 4
3 5
3 6
3 7
4 8
*/
2021/6/16 12:12
加载中...