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;
}