#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e5 + 5;
const int LOG = 17;
int n, q;
int w[N];
vector<int> adj[N];
struct PersistentSegTree {
struct Node {
int l = 0, r = 0;
int sum = 0;
};
int n;
vector<Node> seg;
PersistentSegTree() {}
PersistentSegTree(int n) : n(n) {
seg.push_back(Node());
}
int update(int pre, int l, int r, int pos) {
int cur = seg.size();
seg.push_back(seg[pre]);
if (l == r) {
seg[cur].sum += 1;
return cur;
}
int mid = (l + r) >> 1;
if (pos <= mid) {
seg[cur].l = update(seg[pre].l, l, mid, pos);
}
else {
seg[cur].r = update(seg[pre].r, mid + 1, r, pos);
}
int lc = seg[cur].l, rc = seg[cur].r;
seg[cur].sum = seg[lc].sum + seg[rc].sum;
return cur;
}
int getKth(int root_u, int root_v, int root_lca, int root_p_lca, int l, int r, int k) {
if (l == r) return l;
int mid = (l + r) >> 1;
int left_u = seg[root_u].l, left_v = seg[root_v].l;
int left_lca = seg[root_lca].l, left_p_lca = seg[root_p_lca].l;
int left_sum = seg[left_u].sum + seg[left_v].sum
- seg[left_lca].sum - seg[left_p_lca].sum;
if (k <= left_sum) {
return getKth(left_u, left_v, left_lca, left_p_lca, l, mid, k);
}
return getKth(seg[root_u].r, seg[root_v].r, seg[root_lca].r, seg[root_p_lca].r, mid + 1, r, k - left_sum);
}
int update(int pre, int pos) {
return update(pre, 0, n, pos);
}
int getKth(int root_u, int root_v, int root_lca, int root_p_lca, int k) {
return getKth(root_u, root_v, root_lca, root_p_lca, 0, n, k);
}
};
PersistentSegTree pst;
int root[N];
int tin[N], tout[N], timer;
int up[LOG][N];
void dfs(int u, int p) {
tin[u] = ++timer;
root[u] = pst.update(root[p], w[u]);
up[0][u] = p;
for (int i = 1; i < LOG; i++) {
up[i][u] = up[i - 1][up[i - 1][u]];
}
for (int v : adj[u]) {
if (v == p) continue;
dfs(v, u);
}
tout[u] = timer;
}
bool isAncestor(int u, int v) {
return (tin[u] <= tin[v] && tout[v] <= tout[u]);
}
int lca(int u, int v) {
if (isAncestor(u, v)) return u;
if (isAncestor(v, u)) return v;
for (int i = LOG - 1; i >= 0; i--) {
if (!isAncestor(up[i][u], v)) {
u = up[i][u];
}
}
return up[0][u];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
for (int u = 1; u <= n; u++) cin >> w[u];
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> vals;
for (int u = 1; u <= n; u++) vals.push_back(w[u]);
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
int sz = vals.size();
for (int u = 1; u <= n; u++) {
w[u] = lower_bound(vals.begin(), vals.end(), w[u]) - vals.begin();
}
pst = PersistentSegTree(sz - 1);
pst.seg.reserve(18 * n);
dfs(1, 1);
while (q--) {
int u, v, k;
cin >> u >> v >> k;
int lca_uv = lca(u, v);
int p_lca = (lca_uv == 1 ? 0 : up[0][lca_uv]);
int ans = pst.getKth(root[u], root[v], root[lca_uv], root[p_lca], k);
ans = vals[ans];
cout << ans << '\n';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKY29uc3QgaW50IExPRyA9IDE3OyAgCgppbnQgbiwgcTsgICAKaW50IHdbTl07CnZlY3RvcjxpbnQ+IGFkaltOXTsKCnN0cnVjdCBQZXJzaXN0ZW50U2VnVHJlZSB7CglzdHJ1Y3QgTm9kZSB7CgkJaW50IGwgPSAwLCByID0gMDsgCgkJaW50IHN1bSA9IDA7ICAKCX07IAoKCWludCBuOyAKCXZlY3RvcjxOb2RlPiBzZWc7IAoKCVBlcnNpc3RlbnRTZWdUcmVlKCkge30KCglQZXJzaXN0ZW50U2VnVHJlZShpbnQgbikgOiBuKG4pIHsKCQlzZWcucHVzaF9iYWNrKE5vZGUoKSk7ICAKCX0KCglpbnQgdXBkYXRlKGludCBwcmUsIGludCBsLCBpbnQgciwgaW50IHBvcykgewoJCWludCBjdXIgPSBzZWcuc2l6ZSgpOyAKCQlzZWcucHVzaF9iYWNrKHNlZ1twcmVdKTsgIAoJCWlmIChsID09IHIpIHsKCQkJc2VnW2N1cl0uc3VtICs9IDE7IAoJCQlyZXR1cm4gY3VyOyAKCQl9CgkJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCgkJaWYgKHBvcyA8PSBtaWQpIHsKCQkJc2VnW2N1cl0ubCA9IHVwZGF0ZShzZWdbcHJlXS5sLCBsLCBtaWQsIHBvcyk7IAoJCX0KCQllbHNlIHsKCQkJc2VnW2N1cl0uciA9IHVwZGF0ZShzZWdbcHJlXS5yLCBtaWQgKyAxLCByLCBwb3MpOyAKCQl9CgkJaW50IGxjID0gc2VnW2N1cl0ubCwgcmMgPSBzZWdbY3VyXS5yOyAKCQlzZWdbY3VyXS5zdW0gPSBzZWdbbGNdLnN1bSArIHNlZ1tyY10uc3VtOyAKCQlyZXR1cm4gY3VyOyAKCX0KCglpbnQgZ2V0S3RoKGludCByb290X3UsIGludCByb290X3YsIGludCByb290X2xjYSwgaW50IHJvb3RfcF9sY2EsIGludCBsLCBpbnQgciwgaW50IGspIHsKCQlpZiAobCA9PSByKSByZXR1cm4gbDsgCgkJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCgkJaW50IGxlZnRfdSA9IHNlZ1tyb290X3VdLmwsIGxlZnRfdiA9IHNlZ1tyb290X3ZdLmw7IAoJCWludCBsZWZ0X2xjYSA9IHNlZ1tyb290X2xjYV0ubCwgbGVmdF9wX2xjYSA9IHNlZ1tyb290X3BfbGNhXS5sOyAKCQlpbnQgbGVmdF9zdW0gPSBzZWdbbGVmdF91XS5zdW0gKyBzZWdbbGVmdF92XS5zdW0gCgkJCQkJIC0gc2VnW2xlZnRfbGNhXS5zdW0gLSBzZWdbbGVmdF9wX2xjYV0uc3VtOyAKCQlpZiAoayA8PSBsZWZ0X3N1bSkgewoJCQlyZXR1cm4gZ2V0S3RoKGxlZnRfdSwgbGVmdF92LCBsZWZ0X2xjYSwgbGVmdF9wX2xjYSwgbCwgbWlkLCBrKTsgCgkJfQoJCXJldHVybiBnZXRLdGgoc2VnW3Jvb3RfdV0uciwgc2VnW3Jvb3Rfdl0uciwgc2VnW3Jvb3RfbGNhXS5yLCBzZWdbcm9vdF9wX2xjYV0uciwgbWlkICsgMSwgciwgayAtIGxlZnRfc3VtKTsKCX0KCglpbnQgdXBkYXRlKGludCBwcmUsIGludCBwb3MpIHsKCQlyZXR1cm4gdXBkYXRlKHByZSwgMCwgbiwgcG9zKTsKCX0KCglpbnQgZ2V0S3RoKGludCByb290X3UsIGludCByb290X3YsIGludCByb290X2xjYSwgaW50IHJvb3RfcF9sY2EsIGludCBrKSB7CgkJcmV0dXJuIGdldEt0aChyb290X3UsIHJvb3Rfdiwgcm9vdF9sY2EsIHJvb3RfcF9sY2EsIDAsIG4sIGspOyAKCX0KfTsKClBlcnNpc3RlbnRTZWdUcmVlIHBzdDsgICAKaW50IHJvb3RbTl07IAoKaW50IHRpbltOXSwgdG91dFtOXSwgdGltZXI7IAppbnQgdXBbTE9HXVtOXTsgCgp2b2lkIGRmcyhpbnQgdSwgaW50IHApIHsKCXRpblt1XSA9ICsrdGltZXI7Cglyb290W3VdID0gcHN0LnVwZGF0ZShyb290W3BdLCB3W3VdKTsKCXVwWzBdW3VdID0gcDsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPCBMT0c7IGkrKykgewoJCXVwW2ldW3VdID0gdXBbaSAtIDFdW3VwW2kgLSAxXVt1XV07IAoJfQoJZm9yIChpbnQgdiA6IGFkalt1XSkgewoJCWlmICh2ID09IHApIGNvbnRpbnVlOyAKCQlkZnModiwgdSk7IAoJfQoJdG91dFt1XSA9IHRpbWVyOyAKfQoKYm9vbCBpc0FuY2VzdG9yKGludCB1LCBpbnQgdikgewoJcmV0dXJuICh0aW5bdV0gPD0gdGluW3ZdICYmIHRvdXRbdl0gPD0gdG91dFt1XSk7IAp9CgppbnQgbGNhKGludCB1LCBpbnQgdikgewoJaWYgKGlzQW5jZXN0b3IodSwgdikpIHJldHVybiB1OyAgCglpZiAoaXNBbmNlc3Rvcih2LCB1KSkgcmV0dXJuIHY7ICAKCWZvciAoaW50IGkgPSBMT0cgLSAxOyBpID49IDA7IGktLSkgewoJCWlmICghaXNBbmNlc3Rvcih1cFtpXVt1XSwgdikpIHsKCQkJdSA9IHVwW2ldW3VdOyAKCQl9Cgl9CglyZXR1cm4gdXBbMF1bdV07Cn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuID4+IHE7IAoJZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSBjaW4gPj4gd1t1XTsgIAoJCglmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKCQlpbnQgdSwgdjsKCQljaW4gPj4gdSA+PiB2OyAKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOwoJCWFkalt2XS5wdXNoX2JhY2sodSk7Cgl9CgoJdmVjdG9yPGludD4gdmFsczsgIAoJZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSB2YWxzLnB1c2hfYmFjayh3W3VdKTsKCXNvcnQodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpKTsgIAoJdmFscy5yZXNpemUodW5pcXVlKHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSkgLSB2YWxzLmJlZ2luKCkpOyAKCWludCBzeiA9IHZhbHMuc2l6ZSgpOyAgIAoJCglmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspIHsKCQl3W3VdID0gbG93ZXJfYm91bmQodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpLCB3W3VdKSAtIHZhbHMuYmVnaW4oKTsKCX0KCglwc3QgPSBQZXJzaXN0ZW50U2VnVHJlZShzeiAtIDEpOwoJcHN0LnNlZy5yZXNlcnZlKDE4ICogbik7CglkZnMoMSwgMSk7IAoKCXdoaWxlIChxLS0pIHsKCQlpbnQgdSwgdiwgazsgCgkJY2luID4+IHUgPj4gdiA+PiBrOyAKCQlpbnQgbGNhX3V2ID0gbGNhKHUsIHYpOyAKCQlpbnQgcF9sY2EgPSAobGNhX3V2ID09IDEgPyAwIDogdXBbMF1bbGNhX3V2XSk7ICAgCgkJaW50IGFucyA9IHBzdC5nZXRLdGgocm9vdFt1XSwgcm9vdFt2XSwgcm9vdFtsY2FfdXZdLCByb290W3BfbGNhXSwgayk7IAoJCWFucyA9IHZhbHNbYW5zXTsgCgkJY291dCA8PCBhbnMgPDwgJ1xuJzsKCX0KfQ==