#include <stdio.h>
#include <map>
#include <vector>
#include <iostream>
#include <cstring>
using namespace std;
#define pc(x) putchar_unlocked(x);
inline void writeInt (int n)
{
int N = n, rev, count = 0;
rev = N;
if (N == 0) { pc('0'); pc('\n'); return ;}
while ((rev % 10) == 0) { count++; rev /= 10;} //obtain the count of the number of 0s
rev = 0;
while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;} //store reverse of N in rev
while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;}
while (count--) pc('0');
pc('\n');
}
vector<vector<int> > g ;
map<int,int> mp ;
int rmp[100001];
int dp[100001][20] , val[100001] , depth[100001];
int M ;
inline void fastRead_int(int *a)
{
register char c=0;
while (c<33) c=getchar_unlocked();
*a=0;
while (c>33)
{
*a=*a*10+c-'0';
c=getchar_unlocked();
}
}
struct node{
int sum ;
node *left , *right ;
node(int s) {
sum =s;
left=this ;
right=this;
}
node(int s , node *l , node *r){
sum =s ;
left= l ;
right = r ;
}
};
node *EMPTY , *roots[100001];
node* insert(int val, node *n , int ns=1 , int ne=M-1){
// cout<< ns << ' ' <<ne <<endl;
if(ns >val || ne< val ) return n ;
if(ns==ne) {
return new node(n->sum+1 , EMPTY , EMPTY);
}
node *l= insert(val,n->left,ns,(ns+ne)/2);
node *r= insert(val,n->right,(ns+ne)/2+1,ne);
return new node(l->sum+r->sum,l,r);
}
void dfs(int u , int p){
depth[u]=depth[p]+1;//cout<< u <<' ' <<p << ' '<<val[u]<< endl;
roots[u]=insert(val[u],roots[p]);
for(int i = 0 ; i< g[u].size() ; i++){
int v= g[u][i];
if(v==p) continue;
dp[v][0]=u;
dfs(v,u);
}
}
int lca(int a ,int b){
if(depth[a]<depth[b])swap(a,b);
int l = depth[a]-depth[b];
int d = 18 ;
for(int i = d ; i>=0 ; i--){
if((l>>i)&&1){
l-=(1<<i);
a=dp[a][i];
}
}
if(a==b)return a;
l=depth[a];
d = 18 ;
for(int i = d ; i>=0 ; i--){
if(dp[a][i]!=dp[b][i]) a=dp[a][i], b=dp[b][i];
}
return dp[a][0];
}
int query(node *a , node*b , node*c , node* d ,int k , int ns=1 , int ne=M-1){
if(ns==ne) return ns;
int cnt = a->left->sum+b->left->sum - c->left->sum - d->left->sum ;
if(cnt>=k) return query(a->left , b->left , c->left , d->left , k , ns, (ns+ne)/2);
return query(a->right , b->right , c->right , d->right ,k-cnt , (ns+ne)/2+1 , ne);
}
int main()
{
// std::ios::sync_with_stdio(false);
int n , m ;
// scanf("%d%d",&n,&m);
fastRead_int(&n);fastRead_int(&m);
g.resize(n+1);
for(int i = 1 ; i<=n ; i++)fastRead_int(val+i),mp[val[i]]=0;
for(int i = 0 ; i<n-1 ; i++){
int a , b ;
fastRead_int(&a);fastRead_int(&b);
// scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
M=1;
for(map<int,int>::iterator it=mp.begin() ;it!=mp.end() ; it++){
rmp[M]=it->first;
it->second=M++;
}
for(int i =1 ; i<=n ; i++){
val[i]=mp[val[i]];
}
EMPTY = new node(0);
roots[0]=EMPTY;
// memset(dp,-1 ,sizeof dp);
//cout<< M <<endl;
dfs(1 , 0);//cout<<"DSDS";
for(int i = 1 ; (1<<i)<=n ;i++){
for(int j = 1 ; j<=n ; j++){
// if(dp[j][i-1]!=-1)
dp[j][i]=dp[dp[j][i-1]][i-1];
}
}
while(m--){
int a, b , k ;
// scanf("%d%d%d",&a,&b,&k);
fastRead_int(&a);fastRead_int(&b);fastRead_int(&k);
int c = lca(a,b);
int d = dp[c][0];
// id(d==-1)d=0;
// printf("%d\n",rmp[query(roots[a],roots[b],roots[c],roots[d] , k)]);
printf("%d\n",rmp[query(roots[a],roots[b],roots[c],roots[d] , k)]);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgcGMoeCkgcHV0Y2hhcl91bmxvY2tlZCh4KTsKICAgIGlubGluZSB2b2lkIHdyaXRlSW50IChpbnQgbikKICAgIHsKICAgICAgICBpbnQgTiA9IG4sIHJldiwgY291bnQgPSAwOwogICAgICAgIHJldiA9IE47CiAgICAgICAgaWYgKE4gPT0gMCkgeyBwYygnMCcpOyBwYygnXG4nKTsgcmV0dXJuIDt9CiAgICAgICAgd2hpbGUgKChyZXYgJSAxMCkgPT0gMCkgeyBjb3VudCsrOyByZXYgLz0gMTA7fSAvL29idGFpbiB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiAwcwogICAgICAgIHJldiA9IDA7CiAgICAgICAgd2hpbGUgKE4gIT0gMCkgeyByZXYgPSAocmV2PDwzKSArIChyZXY8PDEpICsgTiAlIDEwOyBOIC89IDEwO30gIC8vc3RvcmUgcmV2ZXJzZSBvZiBOIGluIHJldgogICAgICAgIHdoaWxlIChyZXYgIT0gMCkgeyBwYyhyZXYgJSAxMCArICcwJyk7IHJldiAvPSAxMDt9CiAgICAgICAgd2hpbGUgKGNvdW50LS0pIHBjKCcwJyk7CiAgICAgICAgcGMoJ1xuJyk7CiAgICB9CnZlY3Rvcjx2ZWN0b3I8aW50PiA+IGcgOwptYXA8aW50LGludD4gbXAgOwppbnQgcm1wWzEwMDAwMV07CmludCBkcFsxMDAwMDFdWzIwXSAsIHZhbFsxMDAwMDFdICwgZGVwdGhbMTAwMDAxXTsKaW50IE0gOwoKaW5saW5lIHZvaWQgZmFzdFJlYWRfaW50KGludCAqYSkKewogICAgcmVnaXN0ZXIgY2hhciBjPTA7CiAgICB3aGlsZSAoYzwzMykgYz1nZXRjaGFyX3VubG9ja2VkKCk7CiAgICAqYT0wOwogICAgd2hpbGUgKGM+MzMpCiAgICB7CiAgICAgICAgKmE9KmEqMTArYy0nMCc7CiAgICAgICAgYz1nZXRjaGFyX3VubG9ja2VkKCk7CiAgICB9Cn0KCnN0cnVjdCBub2RlewogICAgaW50IHN1bSAgOwogICAgbm9kZSAqbGVmdCAsICpyaWdodCA7CiAgICBub2RlKGludCBzKSB7CiAgICAgICAgc3VtID1zOwogICAgICAgIGxlZnQ9dGhpcyA7CiAgICAgICAgcmlnaHQ9dGhpczsKICAgIH0KICAgIG5vZGUoaW50IHMgLCBub2RlICpsICwgbm9kZSAqcil7CiAgICAgICAgc3VtID1zIDsKICAgICAgICBsZWZ0PSBsIDsKICAgICAgICByaWdodCA9IHIgOwogICAgfQp9Owpub2RlICpFTVBUWSAsICpyb290c1sxMDAwMDFdOwoKbm9kZSogaW5zZXJ0KGludCB2YWwsIG5vZGUgKm4gLCBpbnQgbnM9MSAsIGludCBuZT1NLTEpewogIC8vICBjb3V0PDwgbnMgPDwgJyAnIDw8bmUgPDxlbmRsOwogICAgaWYobnMgPnZhbCB8fCBuZTwgdmFsICkgcmV0dXJuIG4gOwogICAgaWYobnM9PW5lKSB7CiAgICAgICAgcmV0dXJuIG5ldyBub2RlKG4tPnN1bSsxICwgRU1QVFkgLCBFTVBUWSk7CiAgICB9CiAgICBub2RlICpsPSBpbnNlcnQodmFsLG4tPmxlZnQsbnMsKG5zK25lKS8yKTsKICAgIG5vZGUgKnI9IGluc2VydCh2YWwsbi0+cmlnaHQsKG5zK25lKS8yKzEsbmUpOwogICAgcmV0dXJuIG5ldyBub2RlKGwtPnN1bStyLT5zdW0sbCxyKTsKfQoKdm9pZCBkZnMoaW50IHUgLCBpbnQgcCl7CiAgICBkZXB0aFt1XT1kZXB0aFtwXSsxOy8vY291dDw8IHUgPDwnICcgPDxwIDw8ICcgJzw8dmFsW3VdPDwgZW5kbDsKICAgIHJvb3RzW3VdPWluc2VydCh2YWxbdV0scm9vdHNbcF0pOwogICAgZm9yKGludCBpID0gMCA7IGk8IGdbdV0uc2l6ZSgpIDsgaSsrKXsKICAgICAgICBpbnQgdj0gZ1t1XVtpXTsKICAgICAgICBpZih2PT1wKSBjb250aW51ZTsKICAgICAgICBkcFt2XVswXT11OwogICAgICAgIGRmcyh2LHUpOwogICAgfQp9CgppbnQgbGNhKGludCBhICxpbnQgYil7CiAgICBpZihkZXB0aFthXTxkZXB0aFtiXSlzd2FwKGEsYik7CiAgICBpbnQgbCA9IGRlcHRoW2FdLWRlcHRoW2JdOwogICAgaW50IGQgPSAgMTggOwogICAgZm9yKGludCBpID0gZCA7IGk+PTAgOyBpLS0pewogICAgICAgIGlmKChsPj5pKSYmMSl7CiAgICAgICAgICAgIGwtPSgxPDxpKTsKICAgICAgICAgICAgYT1kcFthXVtpXTsKICAgICAgICB9CiAgICB9CiAgICBpZihhPT1iKXJldHVybiBhOwogICAgbD1kZXB0aFthXTsKICAgIGQgPSAgMTggOwogICAgZm9yKGludCBpID0gZCA7IGk+PTAgOyBpLS0pewogICAgICAgIGlmKGRwW2FdW2ldIT1kcFtiXVtpXSkgYT1kcFthXVtpXSwgYj1kcFtiXVtpXTsKICAgIH0KICAgIHJldHVybiBkcFthXVswXTsKfQoKaW50IHF1ZXJ5KG5vZGUgKmEgLCBub2RlKmIgICwgbm9kZSpjICwgbm9kZSogZCAsaW50IGsgLCBpbnQgbnM9MSAsIGludCBuZT1NLTEpewogICAgaWYobnM9PW5lKSByZXR1cm4gbnM7CiAgICBpbnQgY250ID0gYS0+bGVmdC0+c3VtK2ItPmxlZnQtPnN1bSAtIGMtPmxlZnQtPnN1bSAtIGQtPmxlZnQtPnN1bSA7CiAgICBpZihjbnQ+PWspIHJldHVybiBxdWVyeShhLT5sZWZ0ICwgYi0+bGVmdCAsIGMtPmxlZnQgLCBkLT5sZWZ0ICwgayAsIG5zLCAobnMrbmUpLzIpOwogICAgcmV0dXJuIHF1ZXJ5KGEtPnJpZ2h0ICwgYi0+cmlnaHQgLCBjLT5yaWdodCAsIGQtPnJpZ2h0ICxrLWNudCAsIChucytuZSkvMisxICwgbmUpOwp9CgppbnQgbWFpbigpCnsKIC8vICAgc3RkOjppb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBpbnQgbiAsIG0gOwovLyAgICBzY2FuZigiJWQlZCIsJm4sJm0pOwogICAgZmFzdFJlYWRfaW50KCZuKTtmYXN0UmVhZF9pbnQoJm0pOwogICAgZy5yZXNpemUobisxKTsKICAgIGZvcihpbnQgaSA9IDEgOyBpPD1uIDsgaSsrKWZhc3RSZWFkX2ludCh2YWwraSksbXBbdmFsW2ldXT0wOwogICAgZm9yKGludCBpID0gMCA7IGk8bi0xIDsgaSsrKXsKICAgICAgICBpbnQgYSAsIGIgOwogICAgICAgIGZhc3RSZWFkX2ludCgmYSk7ZmFzdFJlYWRfaW50KCZiKTsKLy8gICAgICAgIHNjYW5mKCIlZCVkIiwmYSwmYik7CiAgICAgICAgZ1thXS5wdXNoX2JhY2soYik7CiAgICAgICAgZ1tiXS5wdXNoX2JhY2soYSk7CiAgICB9CiAgICBNPTE7CiAgICBmb3IobWFwPGludCxpbnQ+OjppdGVyYXRvciBpdD1tcC5iZWdpbigpIDtpdCE9bXAuZW5kKCkgOyBpdCsrKXsKICAgICAgICBybXBbTV09aXQtPmZpcnN0OwogICAgICAgIGl0LT5zZWNvbmQ9TSsrOwogICAgfQogICAgZm9yKGludCBpID0xICA7IGk8PW4gOyBpKyspewogICAgICAgIHZhbFtpXT1tcFt2YWxbaV1dOwogICAgfQogICAgRU1QVFkgPSBuZXcgbm9kZSgwKTsKICAgIHJvb3RzWzBdPUVNUFRZOwogICAvLyBtZW1zZXQoZHAsLTEgLHNpemVvZiBkcCk7CiAgICAvL2NvdXQ8PCBNIDw8ZW5kbDsKICAgIGRmcygxICwgMCk7Ly9jb3V0PDwiRFNEUyI7CiAgICBmb3IoaW50IGkgPSAxIDsgKDE8PGkpPD1uIDtpKyspewogICAgICAgIGZvcihpbnQgaiA9IDEgOyBqPD1uIDsgaisrKXsKICAgICAgICAgIC8vICBpZihkcFtqXVtpLTFdIT0tMSkKICAgICAgICAgICAgZHBbal1baV09ZHBbZHBbal1baS0xXV1baS0xXTsKICAgICAgICB9CiAgICB9CiAgICB3aGlsZShtLS0pewogICAgICAgIGludCBhLCBiICwgayA7Ci8vICAgICAgICBzY2FuZigiJWQlZCVkIiwmYSwmYiwmayk7CiAgICAgICAgZmFzdFJlYWRfaW50KCZhKTtmYXN0UmVhZF9pbnQoJmIpO2Zhc3RSZWFkX2ludCgmayk7CiAgICAgICAgaW50IGMgPSBsY2EoYSxiKTsKICAgICAgICBpbnQgZCA9IGRwW2NdWzBdOwogICAgIC8vICAgaWQoZD09LTEpZD0wOwovLyAgICAgICAgcHJpbnRmKCIlZFxuIixybXBbcXVlcnkocm9vdHNbYV0scm9vdHNbYl0scm9vdHNbY10scm9vdHNbZF0gLCBrKV0pOwogICAgICAgIHByaW50ZigiJWRcbiIscm1wW3F1ZXJ5KHJvb3RzW2FdLHJvb3RzW2JdLHJvb3RzW2NdLHJvb3RzW2RdICwgayldKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==