为什么这东西MLE了?
查看原帖
为什么这东西MLE了?
199459
Masna_Kimoyo楼主2023/8/25 11:40
#include<bits/stdc++.h>
//#define int long long 
using namespace std;
const int N=1e5+5;
struct tree{
	int ls,rs;
	int sum;
}T[N*32];
#define sum(x) T[x].sum
#define ls(x) T[x].ls
#define rs(x) T[x].rs
struct node{
	int to,nxt;
}Edge[N<<1];
int head[N],son[N],top[N],siz[N],dep[N],fa[N],rt[N],a[N];
int n,m,ans,tot,cnt;
inline void add(int u,int v){
	Edge[++tot].to=v;
	Edge[tot].nxt=head[u];
	head[u]=tot;
}
inline void update(int lst,int &p,int l,int r,int pos){
	p=++cnt;
	T[p]=T[lst];sum(p)++;
	if(l==r)	return ;
	int mid=l+r>>1;
	if(pos<=mid)	update(ls(lst),ls(p),l,mid,pos);
	else	update(rs(lst),rs(p),mid+1,r,pos);
}
inline int query(int u,int v,int lc,int flc,int l,int r,int k){
	if(l==r)	return l;
	int val=sum(ls(u))+sum(ls(v))-sum(ls(lc))-sum(ls(flc)),mid=l+r>>1;
//	cerr<<l<<' '<<r<<' '<<k<<' '<<val<<endl;
	if(val>=k)	return query(ls(u),ls(v),ls(lc),ls(flc),l,mid,k);
	return query(rs(u),rs(v),rs(lc),rs(flc),mid+1,r,k-val);
}
inline void dfs1(int x,int f){
	fa[x]=f,siz[x]=1,dep[x]=dep[f]+1;
	update(rt[f],rt[x],0,INT_MAX,a[x]);
	for(register int i=head[x];i;i=Edge[i].nxt){
		int v=Edge[i].to;
		if(v==f)	continue;
		dfs1(v,x);
		siz[x]+=siz[v];
		if(siz[v]>siz[son[x]])	son[x]=v;
	}
}
inline void dfs2(int x,int topx){
	top[x]=topx;
	if(!son[x])	return ;
	dfs2(son[x],topx);
	for(register int i=head[x];i;i=Edge[i].nxt){
		int v=Edge[i].to;
		if(v==fa[x] || v==son[x])	continue;
		dfs2(v,v);
	}
}
inline int 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])	swap(x,y);
	return x;
}
signed main(){
	//	freopen(".in","r",stdin);
	//	freopen(".out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(),cout.tie();
	cin>>n>>m;
	for(register int i=1;i<=n;++i){
		cin>>a[i];
	}
	for(register int i=1;i<n;++i){
		int u,v;cin>>u>>v;
		add(u,v),add(v,u);
	}
	dfs1(1,0),dfs2(1,1);
	while(m--){
		int u,v,k;cin>>u>>v>>k;
		u^=ans;
		int lc=lca(u,v),lcf=fa[lc];
		ans=query(rt[u],rt[v],rt[lc],rt[lcf],0,INT_MAX,k);
		cout<<ans<<endl;
	}
	return 0;
}
2023/8/25 11:40
加载中...