求助 萌新刚学数据结构 主席树样例能过一交全RE
查看原帖
求助 萌新刚学数据结构 主席树样例能过一交全RE
743811
Shakespeare07楼主2023/1/20 10:28

rt.

#include<bits/stdc++.h>
using namespace std;

#define il inline
#define re register

il int maxx(re int x,re int y){
	return x>y?x:y;
}
il int minn(re int x,re int y){
	return x<y?x:y;
}
il int read(){
   int s=0,w=1; char c=getchar();
   while(!isdigit(c)){ if(c=='-') w=-1; c=getchar();}
   while(isdigit(c)){ s=(s<<3)+(s<<1)+(c^48); c=getchar();}
   return s*w;
}
il void write(re int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9) write(x/10);
	putchar((char)(x%10+48));
}

const int N=1e5+5;

int n,m,e,tot;
int to[N<<1],ne[N<<1],h[N],a[N],b[N];
void add(int x,int y){
	to[++e]=y,ne[e]=h[x],h[x]=e;
}

int son[N],sz[N],dep[N],fa[N];
void dfs(int x,int Fa){
	sz[x]=1,dep[x]=dep[Fa]+1,fa[x]=Fa;
	for(int i=h[x];i;i=ne[i]){
		int y=to[i];
		if(y==Fa) continue;
		dfs(y,x);
		sz[x]+=sz[y];
		if(sz[y]>sz[son[x]]) son[x]=y;
	}
}
int top[N];
void dfs2(int x,int t){
	top[x]=t;
	if(son[x]) dfs2(son[x],t);
	for(int i=h[x];i;i=ne[i]){
		int y=to[i];
		if(y==fa[x] || y==son[x]) continue;
		dfs2(y,y);
	}
}

int get_lca(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y]) return x;
	return y;
}

int rt[N],cnt;
struct sgt{
	int lc,rc,sum;
	#define lc(x) tr[x].lc
	#define rc(x) tr[x].rc
	#define sum(x) tr[x].sum
	sgt(){ lc=rc=sum=0;}
}tr[N<<5];

void pushup(int x){
	sum(x)=sum(lc(x))+sum(rc(x));
}
void update(int &p,int pre,int l,int r,int x){
	if(!p) p=++cnt;
	tr[p]=tr[pre];
	if(l==r){
		++sum(p);
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) update(lc(p),lc(pre),l,mid,x);
	else update(rc(p),rc(pre),mid+1,r,x);
	pushup(p);
}
int query(int x,int y,int lca,int falca,int l,int r,int k){
	if(l==r) return l;
	int mid=l+r>>1;
	int now=sum(lc(x))+sum(lc(y))-sum(lc(lca))-sum(lc(falca));
	if(k<=now) return query(lc(x),lc(y),lc(lca),lc(falca),l,mid,k);
	else return query(rc(x),rc(x),rc(lca),rc(falca),mid+1,r,k-now);
}

void build(int x){
	for(int i=h[x];i;i=ne[i]){
		int y=to[i];
		if(y==fa[x]) continue;
		update(rt[y],rt[x],1,tot,a[y]);
		build(y);
	}
}

int main(){
//	freopen("test.in","r",stdin);
	
	n=read(),m=read();
	for(int i=1;i<=n;++i) a[i]=b[i]=read();
	sort(b+1,b+n+1);
	tot=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;++i){
		a[i]=lower_bound(b+1,b+tot+1,a[i])-b;
	}
	for(int i=1;i<n;++i){
		int x=read(),y=read();
		add(x,y),add(y,x);
	}
	
	dfs(1,0);
	dfs2(1,1);
	
	update(rt[1],rt[0],1,tot,a[1]);
	build(1);
	
	int lst=0;
	while(m--){
		int x=read(),y=read(),k=read(); x^=lst;
		int Mcky=get_lca(x,y);
		lst=query(rt[x],rt[y],rt[Mcky],rt[fa[Mcky]],1,tot,k);
		lst=b[lst];
		write(lst),putchar('\n');
	}
	
	return 0;
}
2023/1/20 10:28
加载中...