账号肯定没问题.
// #include<cassert>//////////
// #include<cctype>
// #include<climits>
// #include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
// #include<ctime>
#include<algorithm>
using std::lower_bound;
// using std::max;
// using std::min;
// using std::next_permutation;
// using std::reverse;
using std::sort;
using std::swap;
using std::unique;
// using std::upper_bound;
// #include<bitset>
// using std::bitset;
// #include<deque>
// using std::deque;
// #include<fstream>
// using std::ifstream;
// using std::ofstream;
// #include<iomanip>
// using std::fixed;
// using std::setprecision;
// #include<iostream>
// using std::cin;
// using std::cout;
// using std::ios;
// #include<list>
// using std::list;
// #include<map>
// using std::map;
// #include<memory>
// using std::make_unique;
// using std::move;
// using std::unique_ptr;
// #include<queue>
// using std::priority_queue;
// using std::queue;
// #include<stack>
// using std::stack;
// #include<set>
// using std::multiset;
// using std::set;
// #include<sstream>
// using std::stringstream;
// #include<string>
// using std::getline;
// using std::string;
// using std::to_string;
// #include<utility>
// using std::make_pair;
// using std::pair;
// #include<unordered_map>
// using std::unordered_map;
// #include<unordered_set>
// using std::unordered_set;
// #include<vector>
// using std::vector;
// #include<windows.h>
#define UP(i,a,b) for(i=a;i<=(b);++i)
#define DN(i,a,b) for(i=a;i>=(b);--i)
#define up(i,a,b) for(i=a;i<(b);++i)
#define dn(i,a,b) for(i=a;i>(b);--i)
#define pai make_pair
#define gtch() char(getchar())
#define ptch putchar
#define EXIT() system("pause");\
return 0
typedef unsigned char unc;
typedef unsigned short uns;
typedef unsigned uni;
typedef unsigned long unl;
typedef long long ll;
typedef unsigned long long ull;
bool ___f;
char ___c,___a[45],*___p;
typedef __int128 pll;
typedef unsigned __int128 upll;
void rd(pll &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}if(___f){r=~(r-1);}}
void rd(upll &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}}
void wt(pll r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(upll r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void rd(bool &r){r=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r|=bool(___c^'0');}}
void rd(char &c){for(c=gtch();c==' '||c=='\r'||c=='\n';c=gtch());}
void rd(short &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(short)(___c^'0');}if(___f){r=~(r-1);}}
void rd(int &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}if(___f){r=~(r-1);}}
void rd(long &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}if(___f){r=~(r-1);}}
void rd(ll &r){r=0;___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch()){___f=(___c=='-');}for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}if(___f){r=~(r-1);}}
void rd(unc &c){for(c=gtch();c==' '||c=='\r'||c=='\n';c=gtch());}
void rd(uns &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(uns)(___c^'0');}}
void rd(uni &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}}
void rd(unl &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}}
void rd(ull &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch()){r=(r<<3)+(r<<1)+(___c^'0');}}
void rd(char *s){for(*s=gtch();*s==' '||*s=='\r'||*s=='\n';*s=gtch());for(;~*s&&*s!=' '&&*s!='\r'&&*s!='\n';++s,*s=gtch());*s=0;}
void rd(char *s,char n){for(*s=gtch();*s==' '||*s=='\r'||*s=='\n';*s=gtch());for(;~*s&&*s!=n;++s,*s=gtch());*s=0;}
void wt(bool a){ptch('0'+a);}
void wt(char c){ptch(c);}
void wt(short r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(int r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(long r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(ll r){if(!r){ptch('0');return;}if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(unc c){ptch(c);}
void wt(uns r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(uni r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(unl r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(ull r){if(!r){ptch('0');return;}___p=___a;while(r!=0){++___p;*___p=char(r%10)^'0';r/=10;}while(___p!=___a){ptch(*___p);--___p;}}
void wt(char *s){for(;*s;++s){ptch(*s);}}
void wt(const char *s){for(;*s;++s){ptch(*s);}}
#ifdef _GLIBCXX_STRING
void rd(std::string &s){s.clear();for(___c=gtch();___c==' '||___c=='\r'||___c=='\n';___c=gtch());for(;~___c&&___c!=' '&&___c!='\r'&&___c!='\n';___c=gtch()){s.push_back(___c);}}
void wt(std::string s){wt(s.data());}
#endif
template<typename T,typename ...T1>void rd(T &a,T1 &...b){rd(a);rd(b...);}
template<typename T,typename ...T1>void wt(T a,T1 ...b){wt(a);wt(b...);}
template<typename T>void RD(T* a,int n=1){while(n--){rd(*a);++a;}}
ll llabs_(ll a){return a<0?-a:a;}
/*
*/
const int N(1e5+5);
int a[N],li[N],fa[N][18],dep[N],n,m,unq,lastans;
struct edge{
int v;
edge *nx;
};
struct graph{
edge *h[N],e[N<<1],*p;
void add(int u,int v){
++p;p->nx=h[u];p->v=v;h[u]=p;
}
void add_edge(int u,int v){
add(u,v);add(v,u);
}
void clear(){memset(h,0,sizeof h);p=e;}
graph(){clear();}
}g;
struct node{
int sz;
node *ls,*rs;
}t[N<<5],*root[N],*p(t);
node* update(node* f,int x,int l=1,int r=unq){
int mid((l+r)>>1);
node *u(++p);
u->ls=f->ls;u->rs=f->rs;
if(l==r){
++u->sz;
return u;
}
u->sz=f->sz+1;
if(x<=mid){
u->ls=update(f->ls,x,l,mid);
}else{
u->rs=update(f->rs,x,mid+1,r);
}
return u;
}
int query(node *u,node *v,node *lca,node *lcafa,int k,int l=1,int r=unq){
// printf("%p %p %p\n",u->ls,v->ls,lca->ls);
int mid((l+r)>>1),x(u->ls->sz+v->ls->sz-lca->ls->sz-lcafa->ls->sz);
if(l==r){
return li[l];
}
if(k<=x){
return query(u->ls,v->ls,lca->ls,lcafa->ls,k,l,mid);
}else{
return query(u->rs,v->rs,lca->rs,lcafa->rs,k-x,mid+1,r);
}
}
void dfs(int u,int father){
int i,v;
edge *e;
// printf("dfs u=%d fa=%d\n",u,father);
*fa[u]=father;dep[u]=dep[father]+1;
// printf("fa[%d][0]=%d\n",u,fa[u][0]);
root[u]=update(root[father],a[u]);
for(e=g.h[u];e;e=e->nx){
v=e->v;
if(v!=father){
dfs(v,u);
}
}
}
int lca(int u,int v){
int i;
if(dep[u]<dep[v])swap(u,v);
// printf("fa[u]=%d dep=%d\n",*fa[u],dep[*fa[u]]);
DN(i,17,0)if(dep[fa[u][i]]>=dep[v])u=fa[u][i];
if(u==v)return u;
// printf("u=%d v=%d\n",u,v);
DN(i,17,0)if(fa[u][i]!=fa[v][i]){u=fa[u][i];v=fa[v][i];}
return *fa[u];
}
void init_lca(){
int i,i1;
UP(i1,1,17){
UP(i,1,n){
fa[i][i1]=fa[fa[i][i1-1]][i1-1];
// printf("fa[%d]=%d%c",i,*fa[i]," \n"[i==n]);
}
}
}
void init(){
root[0]=t;
t->ls=t->rs=t;
}
int main(){
int i,u,v,k,t1;
// freopen("1.in","r",stdin);
init();
rd(n,m);
RD(a+1,n);
memcpy(li,a,sizeof a);
sort(li+1,li+n+1);
unq=unique(li+1,li+n+1)-(li+1);
up(i,1,n){
rd(u,v);
g.add(u,v);g.add(v,u);
}
UP(i,1,n){
a[i]=lower_bound(li+1,li+unq+1,a[i])-li;
}
dfs(1,0);
// UP(i,1,p-t){
// if(!t[i].ls||!t[i].rs){
// printf("i=%d\n",i);
// }
// }
init_lca();
// UP(i,0,n){
// printf("root[%d]=%p\n",i,root[i]);
// }
// printf("t=%p\n",t);
while(m--){
rd(u,v,k);u^=lastans;
// printf("u=%d v=%d",u,v);
// printf(" lca=%d\n",lca(u,v));
t1=lca(u,v);
wt(lastans=query(root[u],root[v],root[t1],root[*fa[t1]],k),'\n');
}
EXIT();
return 0;
}