主席树全RE求助
查看原帖
主席树全RE求助
289304
HAuCl4楼主2022/10/15 22:22

RT,下载数据发现wa了,不过不知道哪里错了/kk

//P2633
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=100005,M=200005;
int hd[N],nxt[M],to[M],tif;
void add(int x,int y)
{
	to[++tif]=y;
	nxt[tif]=hd[x];
	hd[x]=tif;
}
void link(int x,int y)
{
	add(x,y); add(y,x);
}
int c[N],t[N];
int nz,n;
void lisanhua()
{
	memcpy(t,c,sizeof(t));
	sort(t+1,t+n+1);
	nz=unique(t+1,t+n+1)-t-1;
	for(int i=1;i<=n;i++) c[i]=lower_bound(t+1,t+nz+1,c[i])-t;
} 
int dep[N],fa[N],son[N],sz[N];
void dfs1(int u,int f,int d)
{
	dep[u]=d; fa[u]=f; sz[u]=1;
	for(int i=hd[u];i;i=nxt[i])
	{
		int v=to[i];
		if(v==f) continue;
		dfs1(v,u,d+1);
		sz[u]+=sz[v];
		if(sz[v]>sz[son[u]]) son[u]=v;
	}
}
int top[N];
void dfs2(int u,int t)
{
	top[u]=t;
	if(!son[u]) return;
	dfs2(son[u],t);
	for(int i=hd[u],v;i;i=nxt[i])
	{
		v=to[i];
		if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
	}
}
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]];
	}
	return dep[x]<dep[y]?x:y;
}
int tot=0;
int rt[N],lc[N<<2],rc[N<<2],val[N<<2];
void build(int& rt,int l,int r)
{
	rt=++tot;
	if(l==r) return;
	int mid=(l+r)/2;
	build(lc[rt],l,mid);
	build(rc[rt],mid+1,r);
}
void update(int rt1,int& rt2,int l,int r,int x) 
{
	rt2=++tot;
	val[rt2]=val[rt1]+1;
	if(l==r) return;
	lc[rt2]=lc[rt1];
	rc[rt2]=rc[rt1];
	int mid=(l+r)/2;
	if(x<=mid)
		update(lc[rt1],lc[rt2],l,mid,x);
	else
		update(rc[rt1],rc[rt2],mid+1,r,x);
}// u v lca fa[lca]
int query(int rt1,int rt2,int rt3,int rt4,int l,int r,int k)
{
	int mid=(l+r)/2;
	if(l>=r) return l;
    if(val[lc[rt1]]+val[lc[rt2]]-val[lc[rt3]]-val[lc[rt4]]>=k) return query(lc[rt1],lc[rt2],lc[rt3],lc[rt4],l,mid,k);
    return query(rc[rt1],rc[rt2],rc[rt3],rc[rt4],mid+1,r,k-(val[lc[rt1]]+val[lc[rt2]]-val[lc[rt3]]-val[lc[rt4]]));
}
int main()
{
//	freopen("dd.in","r",stdin);
//	freopen("out.txt","w",stdout);
	scanf("%d",&n);
	
	int qwq;
	scanf("%d",&qwq);
	for(int i=1;i<=n;i++) scanf("%d",&c[i]);
	lisanhua();
	
	for(int i=1,ta,tb;i<n;i++)
	{
		scanf("%d%d",&ta,&tb);
		link(ta,tb);
	}
	dfs1(1,0,1);
	dfs2(1,1);
//	fa[1]=1;
	build(rt[0],1,nz);
	for(int i=1;i<=n;i++) update(rt[fa[i]],rt[i],1,nz,c[i]);
	int lstans=0;
	int u,v,l,k;
	while(qwq--)
	{
		scanf("%d%d%d",&u,&v,&k);
		u^=lstans;
		l=lca(u,v);
//		printf("lca=%d\n",l);
		lstans=t[query(rt[u],rt[v],rt[l],rt[fa[l]],1,nz,k)];
		printf("%d\n",lstans);
	}
	return 0;
}

2022/10/15 22:22
加载中...