rt.
#1 的第一个询问就 WA 了,但找不出来哪错了,求调 谢谢!
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n,m,a[N],b[N],tot,head[N],lst,rt[N];
int f[N][25],dep[N],len,cnt;
struct edge {int v,nxt;}e[N << 1];
struct tree {
int ls,rs,sum;
}t[N * 25];
int id(int x) {
return lower_bound(b + 1,b + len + 1,a[x]) - b;
}
void add(int u,int v) {
e[++tot] = edge {v,head[u]};
head[u] = tot;
}
void build(int &p,int l,int r) {
p = ++cnt,t[p].sum = 0;
if(l == r) return;
int mid = (l + r) >> 1;
build(t[p].ls,l,mid);
build(t[p].rs,mid + 1,r);
}
void ins(int &p,int p0,int l,int r,int qp) {
p = ++cnt,t[p].sum = t[p0].sum + 1;
if(l == r) return;
int mid = (l + r) >> 1;
if(qp <= mid) ins(t[p].ls,t[p0].ls,l,mid,qp);
else ins(t[p].rs,t[p0].rs,mid + 1,r,qp);
}
void dfs(int u,int fa){
ins(rt[u],rt[fa],1,len,id(u));
f[u][0] = fa,dep[u] = dep[fa] + 1;
for(int i = 1;i <= 20;i++)
f[u][i] = f[f[u][i - 1]][i - 1];
for(int i = head[u];i;i = e[i].nxt) {
int v = e[i].v;
if(v != fa) dfs(v,u);
}
}
int LCA(int u,int v) {
if(dep[u] < dep[v]) swap(u,v);
for(int i = 20;i >= 0;i--)
if(dep[f[u][i]] >= dep[v]) u = f[u][i];
if(u == v) return u;
for(int i = 20;i >= 0;i--)
if(f[u][i] != f[v][i])
u = f[u][i],v = f[v][i];
return f[u][0];
}
int query(int p1,int p2,int p3,int p4,int l,int r,int k) {
if(l == r) return l;
int mid = (l + r) >> 1;
int sum = t[t[p1].ls].sum + t[t[p2].ls].sum - t[t[p3].ls].sum - t[t[p4].ls].sum;
if(sum >= k) return query(t[p1].ls,t[p2].ls,t[p3].ls,t[p4].ls,l,mid,k);
else return query(t[p1].rs,t[p2].rs,t[p3].rs,t[p4].rs,mid + 1,r,k - sum);
}
int main() {
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++) {
scanf("%d",&a[i]);
b[i] = a[i];
}
for(int i = 1;i < n;i++) {
int u,v; scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
sort(b + 1,b + n + 1);
len = unique(b + 1,b + n + 1) - b - 1;
build(rt[0],1,len); dfs(1,0);
for(int i = 1;i <= m;i++) {
int u,v,k;
scanf("%d%d%d",&u,&v,&k);
u ^= lst; int lca = LCA(u,v);
//printf("%d %d %d : %d\n",u,v,k,lca);
int now = b[query(rt[u],rt[v],rt[lca],rt[f[lca][0]],1,len,k)];
printf("%d\n",now); lst = now;
}
return 0;
}