#include<bits/stdc++.h>
#define forUp(i,a,b) for(int i=(a);i<=(b);++i)
#define forUP(i,a,b) for(int i=(a);i<(b);++i)
#define forDown(i,a,b) for(int i=(a);i>=(b);--i)
#define forG(u,v) for(int __i=head[u],v=to[__i];__i;__i=nxt[__i],v=to[__i])
#define forWG(u,v,c) for(int __i=head[u],v=to[__i],c=w[__i];__i;__i=nxt[__i],v=to[__i],c=w[__i])
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define popc __builtin_popcount
#define popc64 __builtin_popcountll
#define seteps(n) fixed<<setprecision(n)
bool __mst;using int16=short;using uint16=unsigned short;using uint=unsigned int;using int64=long long;using uint64=unsigned long long;using int128=__int128;using uint128=unsigned __int128;
using float64=double;using float80=long double;constexpr int INF=0x3f3f3f3f,MINF=0xcfcfcfcf;constexpr int64 INF64=0x3f3f3f3f3f3f3f3f,MINF64=0xcfcfcfcfcfcfcfcf;constexpr float64 INFDB=1e50,eps=1e-6;
template<class _Tp>inline void chkMax(_Tp &x,const _Tp &y){x<y?x=y:x;}template<class _Tp>inline void chkMin(_Tp &x,const _Tp &y){x>y?x=y:x;}
inline int addMod(const int &x,const int &y,const int mod){int ans=x+y;return ans>=mod?ans-mod:ans;}inline int subMod(const int &x,const int &y,const int mod){int ans=x-y;return ans<0?ans+mod:ans;}
constexpr int N=1e5+10;int __test_num=1,__task_id,__tst;using namespace std;void __init();
int n,q,A[N],ans[N];vector<int> G[N];vector<array<int,3>> asks[N];
int tot,sz[N],CG,mxsz[N];bool calced[N];
int getsz(int rt,int fa=0){
sz[rt]=1;
for(int son:G[rt])if(son!=fa&&!calced[son])sz[rt]+=getsz(son,rt);
return sz[rt];
}
void findCG(int rt,int fa=0){
mxsz[rt]=tot-sz[rt];
for(int son:G[rt])if(son!=fa&&!calced[son])chkMax(mxsz[rt],sz[son]),findCG(son,rt);
if(mxsz[rt]<mxsz[CG])CG=rt;
}
bool vis[N];vector<array<int,3>> opts;int lst[N];
void dfs(int rt,int fa=0,int mn=INF,int mx=MINF){
chkMin(mn,rt);chkMax(mx,rt);
opts.pushb({mn,A[rt],mx});lst[A[rt]]=0;
for(auto [qid,l,r]:asks[rt])if(!vis[qid]&&l<=mn&&mx<=r)opts.pushb({l,-qid,r}),vis[qid]=true;
for(int son:G[rt])if(son!=fa&&!calced[son])dfs(son,rt,mn,mx);
}
int c[N];
void upd(int pos,int val){for(;pos<=n;pos+=pos&-pos)c[pos]+=val;}
int ask(int pos){int ans=0;for(;pos;pos-=pos&-pos)ans+=c[pos];return ans;}
void solve(int rt){
tot=getsz(rt);
CG=rt;findCG(rt);
opts.clear();dfs(CG);sort(opts.begin(),opts.end(),greater<array<int,3>>());
for(auto [l,qid,r]:opts){
if(qid>0){
if(lst[qid])upd(lst[qid],-1);
else lst[qid]=r;
upd(lst[qid]=min(lst[qid],r),1);
}
else ans[-qid]=ask(r);
}
for(auto [l,qid,r]:opts)if(qid>0&&lst[qid])upd(lst[qid],-1),lst[qid]=0;
calced[CG]=true;
for(int son:G[CG])if(!calced[son])solve(son);
}
bool __med;void __solve(int __test_id){
cin>>n>>q;
forUp(i,1,n)cin>>A[i];
forUP(i,1,n){
int u,v;cin>>u>>v;
G[u].pushb(v);G[v].pushb(u);
}
forUp(i,1,q){
int l,r,u;cin>>l>>r>>u;
asks[u].pushb({i,l,r});
}
solve(1);
forUp(i,1,q)cout<<ans[i]<<'\n';
}
signed main(){
__init();
forUp(i,1,__test_num)__solve(i);
cerr<<1000.0*(clock()-__tst)/CLOCKS_PER_SEC<<"ms "<<((&__mst)-(&__med))/1024.0/1024.0<<"MB"<<'\n';
return 0;
}
void __init(){
__tst=clock();
#ifndef use_file
//#define use_file
#endif
#ifdef use_file
const string __file_name="test";freopen((__file_name+".in").c_str(),"r",stdin);freopen((__file_name+".out").c_str(),"w",stdout);
#endif
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//scanf("%d",&__test_num);
//cin>>__task_id;
//cin>>__test_num;
}