直接二分即可,联立发现带入delta判别式式子,只需要找到满足 大于等于b的第一个和小于等于b的最后一个就行了,然后看看delta是否合法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int cnt[N];
int T;
int main()
{
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>cnt[i];
sort(cnt+1,cnt+1+n);
for(int i=1;i<=m;i++){
ll a,b,c;
cin>>a>>b>>c;
int l = 1,r = n;
while(l<r){
int mid = l+r>>1;
if(cnt[mid]<b) l = mid+1;
else r = mid;
}
int k = cnt[l];
int res=0x3f3f3f3f;
if(k>=b&&(ll)(b-k)*(b-k)<4*a*c){
res = k;
}
l = 1,r = n;
while(l<r){
int mid = l+r+1>>1;
if(cnt[mid]>b)r=mid-1;
else l=mid;
}
k = cnt[r];
if(k<=b&&r>=1&&(ll)(b-k)*(b-k)<4*c*a){
res = k;
}
if(res==0x3f3f3f3f)puts("NO");
else{
printf("Yes\n%d\n",res);
}
}
puts("");
}
}