#include<bits/stdc++.h>
using namespace std;
#define ios() ios::sync_with_stdio(false);cin.tie(0);
/*
我们对输入的每一个数字分解质因数,分解过程中把下标存入对应的质因子中数组中。
然后对于每次查询l,r,d,我们只需要对d分解质因数,然后统计当前这个质因数(假设为i)
的个数cnt,如果cnt大于在L~R区间中 i 的个数那么就不行.
*/
vector<int> v[100005]; //G[i]存的是含有i这个因子的下标
//二维数组存、
int x;
// lower_bound(first,end,x):
// first:要查找区间的起始位置(地址)
// end:要查找区间的结束位置(地址)
// 在first和end区间中返回第一个大于等于x的值的迭代器
//
// upper_bound(first,end,x):
// 在first和end区间中返回第一个大于x的值的迭代器
int solve(int l,int r,int d)
{
int i,j;
for(int i=2;i<=d/i;i++)
{
int sum=0;
//将d质因数分解,sum统计d中i因子的个数
while(d%i==0)
{
sum++;
d/=i;
}
if(sum)
{
//在区间[l,r]中i的个数
int t=upper_bound(v[i].begin(),v[i].end(),r)-lower_bound(v[i].begin(),v[i].end(),l);
//返回的是迭代器,并不是int类型,可以进行相减
if(t<sum)
return 0; //数不够
}
}
//若d最后剩下为质数,特别判断
if(d>1)
{
int t=upper_bound(v[d].begin(),v[d].end(),r)-lower_bound(v[d].begin(),v[d].end(),l);
if(t<1)
return 0;
}
return 1;
}
int main()
{
int i,j,t,n,m,l,r,d;
ios();
cin>>t;
while(t--)
{
cin>>n>>m;
//清空
for(int i=0;i<100005;i++)
{
v[i].clear();
}
//质因数分解
for(i=1;i<=n;i++)
{
cin>>x;
for(int j=2;j<=x/j;j++)
{
while(x%j==0)
{
v[j].push_back(i); //不同质因子有哪些对应的下标
x/=j;
}
}
//x是质数
if(x>1)
v[x].push_back(i);
}
for(i=0;i<m;i++)
{
int l,r;
cin>>l>>r>>d;
if(solve(l,r,d))
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}