RT,不知道为什么就 T 了......
TLE on test 15,16,17,18,21
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<cmath>
#include<iomanip>
#include<string>
#include<cstring>
#include<set>
#include<stack>
#include<queue>
#include<bitset>
using namespace std;
namespace IO{
template<typename T>inline void read(T &x){
x=0;
char ch=getchar();
bool flag=0;
while(ch<'0'||ch>'9') flag=flag||(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+(ch^'0'),ch=getchar();
if(ch!='.'){
x=flag?-x:x;
return;
}
double Base=0.1;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x+Base*(ch^'0'),Base/=10.0,ch=getchar();
x=flag?-x:x;
}
template<typename T>void prt(T x){
if(x>9) prt(x/10);
putchar(x%10+'0');
}
template<typename T>inline void put(char ch,T x){
if(x<0) putchar('-'),x=-x;
prt(x);
putchar(ch);
}
const int DM[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
inline void putd(char ch,double x,int w){
if(x<0) putchar('-'),x=-x;
if(!w){
put(ch,(int)(x+0.5));
return;
}
int prex=(int)x;
x-=(int)x;
x*=DM[w];
x+=0.5;
int nowx=(int)x,now=0;
if(nowx>=DM[w]) nowx=0,prex++;
put('.',prex);
int xx=nowx;
if(!xx) now=1;
else while(xx) xx/=10,now++;
now=w-now;
while(now--) putchar('0');
put(ch,nowx);
}
inline void putstr(string s){
for(int i=0;i<s.length();i++) putchar(s[i]);
}
}
using namespace IO;
#define N 100005
#define lowbit(x) (x&-x)
int n,m,w[N],head[N],cnt;
struct edge{
int v,nxt;
}e[N<<1];
struct que{
int l,r,id;
que(){}
que(int _l,int _r,int _id){
l=_l,r=_r,id=_id;
}
inline bool operator<(const que &b)const{
return r<b.r;
}
};
int c[N],siz[N],ans[N],lst[N];
bool vis[N],book[N];
vector<que> q[N],A,B;
vector<int> son[N];
inline void add(int u,int v){
e[++cnt]=(edge){v,head[u]},head[u]=cnt;
}
inline void update(int x,int v){
if(!x) return;
for(;x<=n;x+=lowbit(x)) c[x]+=v;
}
inline int query(int x){
int res=0;
for(;x;x^=lowbit(x)) res+=c[x];
return res;
}
void get_wc(int x,int fa,int sum,int &wc){
siz[x]=1;
int ms=0;
for(int i=head[x];i;i=e[i].nxt){
int v=e[i].v;
if(!vis[v]&&v!=fa){
get_wc(v,x,sum,wc);
ms=max(ms,siz[v]);
siz[x]+=siz[v];
}
}
ms=max(ms,sum-ms);
if(ms<=sum/2) wc=x;
}
void dfs(int x,int fa,int l,int r){
siz[x]=1;
A.emplace_back(que(l,r,w[x]));
for(auto now:q[x])
if(!book[now.id]&&now.l<=l&&now.r>=r) book[now.id]=1,B.push_back(now);
for(int i=head[x];i;i=e[i].nxt){
int v=e[i].v;
if(!vis[v]&&v!=fa) dfs(v,x,min(l,v),max(r,v)),siz[x]+=siz[v];
}
}
inline void devide(int x){
vis[x]=1;
A.clear(),B.clear();
dfs(x,0,x,x);
sort(A.begin(),A.end()),sort(B.begin(),B.end());
for(int i=0,j=0;i<B.size();i++){
while(j<A.size()&&A[j].r<=B[i].r){
if(A[j].l>lst[A[j].id]) update(lst[A[j].id],-1),update(lst[A[j].id]=A[j].l,1);
j++;
}
ans[B[i].id]=query(n)-query(B[i].l-1);
}
for(auto now:A) update(lst[now.id],-1),lst[now.id]=0;
for(int i=head[x];i;i=e[i].nxt){
int v=e[i].v;
if(!vis[v]){
get_wc(v,x,siz[v],v);
devide(v);
}
}
}
int main(){
read(n),read(m);
for(int i=1;i<=n;i++) read(w[i]);
for(int i=1,u,v;i<n;i++)
read(u),read(v),add(u,v),add(v,u);
for(int i=1,l,r,d;i<=m;i++)
read(l),read(r),read(d),q[d].push_back(que(l,r,i));
int x=1;
get_wc(x,0,n,x);
devide(x);
for(int i=1;i<=m;i++) put('\n',ans[i]);
return 0;
}