#include<bits/stdc++.h>
using namespace std;
int t,n,m,q;
int hi[200010];
struct Edge{
int hi,realhi,lo;
}edge[200010];
struct Query{
int mx,a,b,id;
}query[200010];
int ans[200010];
bool cmp(Edge a,Edge b){
return a.realhi<=b.realhi;
}
bool cmp2(Query a,Query b){
return a.mx<=b.mx;
}
int fa[200010];
int Find(int x){
if(fa[x]==x) return x;
return fa[x]=Find(fa[x]);
}
void Merge(int x,int y){
x=Find(x); y=Find(y);
if(x==y) return;
fa[x]=y;
}
bool Connected(int x,int y){
return Find(x)==Find(y);
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=n;i++) scanf("%d",&hi[i]);
int mx=0;
for(int i=1;i<=m;i++){
scanf("%d%d",&edge[i].hi,&edge[i].lo);
if(hi[edge[i].hi]<hi[edge[i].lo])
swap(edge[i].hi,edge[i].lo);
edge[i].realhi=hi[edge[i].hi];
}
sort(edge+1,edge+m+1,cmp); //RE HERE
scanf("%d",&q);
for(int i=1;i<=q;i++) ans[i]=0;
for(int i=1;i<=q;i++){
query[i].id=i;
scanf("%d%d%d",&query[i].a,&query[i].b,&query[i].mx);
query[i].mx+=hi[query[i].a];
}
sort(query+1,query+q+1,cmp2);
int p=1;
for(int i=1;i<=m;i++){
while(hi[edge[i].hi]>query[p].mx&&p<=q){
if(Connected(query[p].a,query[p].b)) ans[query[p].id]=1;
p++;
}
Merge(edge[i].hi,edge[i].lo);
}
while(p<=q){ if(Connected(query[p].a,query[p].b)) ans[query[p].id]=1;
p++;
}
for(int i=1;i<=q;i++)
if(ans[i]==1) printf("Yes\n");
else printf("No\n");
putchar('\n');
}
}
为什么第 45 行的 sort 语句数据大的时候会 RE,求调