RT 完全一样的呆码 开了O2就RE 不开就AC
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#include<iomanip>
#define IOS cin.tie(0), ios::sync_with_stdio(false)
#define fi first
#define se second
#define deb(x) cout << #x << " = " << x << endl
#define deb2(x, y) cout << #x << " = " << x << " " << #y << " = " << y << endl
#define deb3(x, y, z) cout << #x << " = " << x << " " << #y << " = " << y << " " << #z << " = " << z << endl
#define all(x) x.begin(), x.end()
#define pb push_back
#define kill(x) return cout<<x<<'\n', 0;
#define Yes cout << "yes" << endl
#define No cout << "no" << endl;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;
const int N = 200010, M = 10010, mod = 1e9 + 7, mod2 = 998244353, P = 131;
const double eps = 1e-14;
const double PI = acos(-1);
int n,m,t,mx,idx,root[N],dep[N],fa[N][20];
int e[N << 1], ne[N << 1], h[N], idx_edge;
ll w[N],ans;
vector<int> nums;
struct node{
int l, r, cnt;
}tr[N * 40];
void add(int a, int b){ e[idx_edge] = b, ne[idx_edge] = h[a], h[a] = idx_edge ++;}
int get(int x){ return lower_bound(all(nums), x) - nums.begin();}
int insert(int p, int l, int r, ll val){
int q = ++ idx;
tr[q] = tr[p];
if(l == r) {
tr[q].cnt ++;
return q;
}
int mid = l + r >> 1;
if(val <= mid) tr[q].l = insert(tr[p].l, l, mid, val);
else tr[q].r = insert(tr[p].r, mid + 1, r, val);
tr[q].cnt = tr[tr[q].l].cnt + tr[tr[q].r].cnt;
return q;
}
int bfs(){
memset(dep, 0x3f, sizeof dep);
dep[0] = 0, dep[1] = 1;
queue<int> q; q.push(1);
while(!q.empty()){
int fr = q.front(); q.pop();
for(int i = h[fr]; ~i; i = ne[i]){
int j = e[i];
if(dep[j] > dep[fr] + 1){
dep[j] = dep[fr] + 1;
q.push(j);
fa[j][0] = fr;
for(int k = 1; k <= 18; ++ k) fa[j][k] = fa[fa[j][k - 1]][k - 1];
}
}
}
}
int LCA(int a, int b){
if(dep[a] < dep[b]) swap(a, b);
for(int k = 18; k >= 0; -- k) if(dep[fa[a][k]] >= dep[b]) a = fa[a][k];
if(a == b) return a;
for(int k = 18; k >= 0; -- k) if(fa[a][k] != fa[b][k]) a = fa[a][k], b = fa[b][k];
return fa[a][0];
}
void dfs(int u){ //建立主席树
root[u] = insert(root[fa[u][0]], 0, mx, get(w[u]));
for(int i = h[u]; ~i; i = ne[i]){
int j = e[i];
if(j == fa[u][0]) continue ;
dfs(j);
}
}
int query(int u, int v, int lca, int father, int l, int r, int k){
if(l == r) return l;
int mid = l + r >> 1, cnt = tr[tr[u].l].cnt + tr[tr[v].l].cnt - tr[tr[lca].l].cnt - tr[tr[father].l].cnt;
if(cnt >= k) return query(tr[u].l, tr[v].l, tr[lca].l, tr[father].l, l, mid, k);
else return query(tr[u].r, tr[v].r, tr[lca].r, tr[father].r, mid + 1, r, k - cnt);
}
int querypath(int u, int v, int k){
int lca = LCA(u, v);
return query(root[u], root[v], root[lca], root[fa[lca][0]], 0, mx, k);
}
int main(){
// freopen("1.in", "r", stdin);
// freopen("1.out", "w", stdout);
IOS;
cin >> n >> m;
memset(h, -1, sizeof h);
for(int i = 1; i <= n; ++ i) cin >> w[i], nums.pb(w[i]);
sort(all(nums));
nums.erase(unique(all(nums)), nums.end()); mx = nums.size() - 1;
for(int i = 1, a, b; i <= n - 1; ++ i){
cin >> a >> b;
add(a, b), add(b, a);
}
bfs(); dfs(1);
while(m --){
ll l, r, k;
cin >> l >> r >> k; l ^= ans;
ans = nums[querypath(l, r, k)];
cout << ans << endl;
}
return 0;
}