样例过,全RE,求助!
查看原帖
样例过,全RE,求助!
552699
_aknoip_楼主2023/8/9 20:39

全RE,有离散化

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=1e5+10;
int n,m,last,tot,head[N<<1],fa[N<<1][22],dep[N*30],root[N*30],cnt,a[N*30],b[N*30];
struct node
{
	int to,next;
}edge[N<<1];
struct node2
{
	int ls,rs,data;
}t[N*30];
void read(int from,int to)
{
	tot++;
	edge[tot].to=to;
	edge[tot].next=head[from];
	head[from]=tot;
}
void dfs(int x,int fath)
{
	fa[x][0]=fath;
	for(int i=1;i<=18;i++)fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i=head[x];i;i=edge[i].next)
	{
		int y=edge[i].to;
		if(y==fath)continue;
		dep[y]=dep[x]+1;
		dfs(y,x);
	}
}
int build(int l,int r)
{
	int p=++cnt;
	if(l==r)return p;
	int mid=l+r>>1;
	t[p].ls=build(l,mid);
	t[p].rs=build(mid+1,r);
	return p;
}
void pushup(int p)
{
	t[p].data=t[t[p].ls].data+t[t[p].rs].data;
}
int add(int now,int l,int r,int x,int k)
{
	int p=++cnt;
	t[p]=t[now];
	if(l==r)
	{
		t[p].data+=k;
		return p;
	}
	int mid=l+r>>1;
	if(x<=mid)t[p].ls=add(t[p].ls,l,mid,x,k);
	else t[p].rs=add(t[p].rs,mid+1,r,x,k);
	pushup(p);
	return p;
}
int lca(int x,int y)
{
	if(dep[x]>dep[y])swap(x,y);
	for(int i=18;i>=0;i--)
	{
		if(dep[fa[y][i]]>=dep[x])y=fa[y][i];
	}
	if(x==y)return x;
	for(int i=18;i>=0;i--)
	{
		if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
	}
	return fa[x][0];
}
int query(int p1,int p2,int p3,int p4,int l,int r,int x)
{
	if(l==r)return l;
	int mid=l+r>>1;
	int ret=t[t[p1].ls].data+t[t[p2].ls].data-t[t[p3].ls].data-t[t[p4].ls].data;
	if(x<=ret)return query(t[p1].ls,t[p2].ls,t[p3].ls,t[p4].ls,l,mid,x);
	else return query(t[p1].rs,t[p2].rs,t[p3].rs,t[p4].rs,mid+1,r,x-ret);
}
int ord[N];
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		ord[i]=a[i];
	}
	sort(ord+1,ord+n+1);
	int lo=unique(ord+1,ord+n+1)-ord-1;
	for(int i=1;i<=n;i++)
	{
		int aa=a[i];
		a[i]=lower_bound(ord+1,ord+lo+1,a[i])-ord;
		b[a[i]]=aa;
		cout<<a[i]<<endl;
	}
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		read(x,y),read(y,x);
	}
	dep[1]=1;
	dfs(1,0);
	root[0]=build(1,n);
	for(int i=1;i<=n;i++)root[i]=add(root[fa[i][0]],1,n,a[i],1);
	for(int i=1;i<=m;i++)
	{
		int x,y,k;
		cin>>x>>y>>k;
		x^=last;
		int p=lca(x,y);
		last=query(root[x],root[y],root[p],root[fa[p][0]],1,n,k);
		last=b[last];
		cout<<last<<endl;
	}
	return 0;
}
2023/8/9 20:39
加载中...