#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,q,cnt;
int a[N],b[N];
int head[N],tot;
int dep[N],fa[N][25],root[N];
struct node{
int next,to;
}e[N<<1];
void add(int from,int to){
e[++tot].next=head[from];head[from]=tot;e[tot].to=to;
}
struct TREE{
int l,r,lson,rson,sum;
}t[N*30];
void push_up(int p){
t[p].sum=t[t[p].lson].sum+t[t[p].rson].sum;
}
void build(int &p,const int &l,const int &r){
p=++cnt;t[p].l=l;t[p].r=r;if(l==r)return ;
int mid=l+r>>1;
build(t[p].lson,l,mid);build(t[p].rson,mid+1,r);
push_up(p);
}
void adds(int &p,const int &pre,const int &l,const int &r,const int &X,const int &d){
p=++cnt;t[p]=t[pre];
if(l==r){
t[p].sum+=d;return ;
}
int mid=t[p].l+t[p].r>>1;
if(mid>=X){
adds(t[p].lson,t[pre].lson,l,mid,X,d);t[p].rson=t[pre].rson;
}
else{
adds(t[p].rson,t[pre].rson,mid+1,r,X,d);t[p].lson=t[pre].lson;
}
push_up(p);
}
int query(const int &L,const int &R,const int &p){
if(t[p].l>=L&&t[p].r<=R)return t[p].sum;
int mid=t[p].l+t[p].r>>1;
int ret=0;
if(mid>=L)ret+=query(L,R,t[p].lson);
if(mid<R)ret+=query(L,R,t[p].rson);
push_up(p);
return ret;
}
void dfs(int x,int _fa){
dep[x]=dep[_fa]+1;
fa[x][0]=_fa;
for(int i=1;i<=20;i++)fa[x][i]=fa[fa[x][i-1]][i-1];
adds(root[x],root[_fa],1,n,a[x],1);
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;if(y==_fa)continue;
dfs(y,x);
}
}
int lca(int a,int b){
if(dep[a]<dep[b])swap(a,b);
for(int i=20;i>=0;i--)if(dep[fa[a][i]]>=dep[b])a=fa[a][i];
if(a==b)return a;
for(int i=20;i>=0;i--){
if(fa[a][i]!=fa[b][i]){
a=fa[a][i];b=fa[b][i];
}
}
return fa[a][0];
}
signed main(){
cin>>n>>q;build(root[0],1,n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);b[i]=a[i];
}sort(b+1,b+n+1);
for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+n+1,a[i])-b;
for(int i=1;i<n;i++){
int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);
}
dfs(1,0);
int last=0;
while(q--){
int u,v,k;scanf("%d%d%d",&u,&v,&k);u=u^last;
if(u>n||u<=0)continue;
int LCA=lca(u,v);
int p=0;
for(int i=1<<20;i;i>>=1){
if(p+i<=n&&query(1,p+i,root[v])+query(1,p+i,root[u])-query(1,p+i,root[LCA])-query(1,p+i,root[fa[LCA][0]])<k){
p+=i;
}
}p++;
last=b[p];printf("%d\n",last);
}
return 0;
}
哪位大佬能指点一下如何降常数吗?