IDE上用C++98能编译,但是交上去就CE了,不知道为啥pwp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re
#define il
int n,m,ne[200050],e[200050],h[200050],idx;
struct node{
int l,r,k,lc,id;
}Q[200050];int len,ans[200050];
int m_n[200050],sum[200050],val[200050],b[200050],num,c[200050];
int dfsx[200050],fi[200050],se[200050],cnt;
int dep[200050],f[200050][25];
bool vis[200050];
il void add(int a,int b){ne[++idx]=h[a],e[idx]=b,h[a]=idx;}
il void dfs(int now,int fa){
dfsx[++cnt]=now,fi[now]=cnt,dep[now]=dep[fa]+1,f[now][0]=fa;
for(re int i=1;i<24;++i) f[now][i]=f[f[now][i-1]][i-1];
for(re int i=h[now];i;i=ne[i]){
int j=e[i];if(j==fa) continue;
dfs(j,now);
}
dfsx[++cnt]=now,se[now]=cnt;
}
il int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(re int i=23;i>=0;--i) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
if(x==y) return x;
for(re int i=23;i>=0;--i) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
il bool cmp(node a,node b){
if(a.l/len!=b.l/len) return a.l<b.l;
if((a.l/len)&1) return a.r<b.r;
return a.r>b.r;
}
il int get(int x){return (x-1)/len+1;}
il int kth(int k){
for(re int bk=1;bk<=get(n);++bk)
if(k>sum[bk]) k-=sum[bk];
else for(re int i=(bk-1)*len+1;i<=bk*len;++i){
k-=m_n[i];if(k<=0) return c[i];
}
return -1;
}
il void add(int x){++m_n[val[x]],++sum[get(val[x])];}
il void del(int x){--m_n[val[x]],--sum[get(val[x])];}
il void upd(int x){
if(!vis[x]) add(x);
else del(x);
vis[x]^=1;
}
il void Solve(){
int l=1,r=0;
for(re int i=1;i<=m;++i){
while(l>Q[i].l) upd(dfsx[--l]);
while(r<Q[i].r) upd(dfsx[++r]);
while(l<Q[i].l) upd(dfsx[l++]);
while(r>Q[i].r) upd(dfsx[r--]);
if(Q[i].lc) upd(Q[i].lc);
ans[Q[i].id]=kth(Q[i].k);
if(Q[i].lc) upd(Q[i].lc);
}
}
il void read(){
cin>>n>>m;
for(re int i=1;i<=n;++i) cin>>val[i],b[++num]=val[i];
sort(b+1,b+num+1),num=unique(b+1,b+num+1)-(b+1);
for(re int i=1;i<=n;++i) val[i]=lower_bound(b+1,b+num+1,val[i])-b,c[val[i]]=b[val[i]];
for(re int i=1,u,v;i<n;++i) cin>>u>>v,add(u,v),add(v,u);
}
il void solve(){
dfs(1,0);
for(re int i=1;i<=m;++i){
int l,r,k;cin>>l>>r>>k;
int lc=lca(l,r);
if(fi[l]>fi[r]) swap(l,r);
if(lc==l) Q[i]={fi[l],fi[r],k,0,i};
else Q[i]={se[l],fi[r],k,lc,i};
}
len=sqrt(n*2);sort(Q+1,Q+m+1,cmp);
Solve();
for(re int i=1;i<=m;++i) cout<<ans[i]<<"\n";
}
signed main(){
read(),solve();return 0;
}