emmmm,题目一直 RE,知道不知道怎么 AC 之后,然后之前 RE 的代码也好了,
我是不是把洛谷的测评机玩坏了
const int N=2e5+5;
int n,m,_;
int i,j,k;
int a[N];
struct Node
{
int l,r;
int sz;
}t[N<<5];
int root[N],tot=0;
vector<int> G[N],v;
int len;
void update(int &x,int y,int l,int r,int pos)
{
x=++tot;
t[x]=t[y];
t[x].sz++;
if(l==r) return ;
else{
int mid=l+r>>1;
if(mid>=pos) update(t[x].l,t[y].l,l,mid,pos);
else update(t[x].r,t[y].r,mid+1,r,pos);
}
}
int sz[N],son[N],fa[N],dep[N];
void dfs1(int u,int f)
{
dep[u]=dep[f]+1;
fa[u]=f;
sz[u]=1;
update(root[u],root[fa[u]],1,len,a[u]);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==f) continue;
dfs1(v,u);
sz[u]+=sz[v];
if(sz[son[u]]<sz[v]) son[u]=v;
}
}
int top[N];
void dfs2(int u,int f)
{
top[u]=f;
if(!son[u]) return ;
dfs2(son[u],f);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==son[u] || v==fa[u]) continue;
dfs2(v,v);
}
}
int query(int x,int y,int lca,int f,int l,int r,int k)
{
int sum=t[t[x].l].sz+t[t[y].l].sz-t[t[lca].l].sz-t[t[f].l].sz;
if(l==r) return l;
else{
int mid=l+r>>1;
if(sum>=k) return query(t[x].l,t[y].l,t[lca].l,t[f].l,l,mid,k);
else return query(t[x].r,t[y].r,t[lca].r,t[f].r,mid+1,r,k-sum);
}
}
int getid(int x)
{
return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
#define nx top[x]
#define ny top[y]
int getlca(int x,int y)
{
while(nx!=ny){
if(dep[nx]<dep[ny]) swap(x,y);
x=fa[nx];
}
if(dep[x]>dep[y]) swap(x,y);
return x;
}
int main()
{
//IOS;
while(~sdd(n,m)){
for(int i=1;i<=n;i++) sd(a[i]),v.pb(a[i]);
int last=0,x,y;
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
len=v.size();
for(int i=1;i<=n;i++) a[i]=getid(a[i]);
for(int i=1;i<n;i++){
sdd(x,y);
G[x].pb(y);
G[y].pb(x);
}
dfs1(1,0); dfs2(1,1);
for(int i=1;i<=m;i++){
sddd(x,y,k);
x^=last;
int lca=getlca(x,y);
int ans=query(root[x],root[y],root[lca],root[fa[lca]],1,len,k);
last=v[ans-1];
pd(last);
}
break;
}
//PAUSE;
return 0;
}