#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0)
#define endl '\n'
const int N = 2e5 + 10;
int prime[N], m;
int minp[N];
void init(int n){ // 线性筛
for (int i = 2;i <= n;++i){
if (!minp[i])minp[i] = i, prime[++m] = i;
for (int j = 1;j <= m && prime[j] <= n / i;++j){
minp[i * prime[j]] = prime[j];
if (i % prime[j] == 0)break;
}
}
}
int n, q, a[N], b[N];
vector<int>ve[N];
int check(int num, int l, int r){
return upper_bound(ve[num].begin(), ve[num].end(), r) -
lower_bound(ve[num].begin(), ve[num].end(), l);
}
int l[N], r[N];
void solve(){
cin >> n >> q;
for (int i = 1;i <= n;++i)cin >> a[i];
for (int i = 1;i < n;++i)cin >> b[i];
for (int i = 1;i < N;++i)ve[i].clear();
for (int i = 1;i <= n;++i){
int now = a[i]; int cnt = 0;
while (now > 1){
int p = minp[now];
while (now % p == 0)now /= p;
ve[p].push_back(i);
}
}
for (int i = n;i >= 1;--i){
r[i] = i;
while (r[i] < n && check(b[r[i]], i, r[i]))
r[i] = r[r[i] + 1];
}
for (int i = 1;i <= n;++i){
l[i] = i;
while (1){
bool flag = 0;
if (l[i] > 1 && check(b[l[i] - 1], l[i], r[i])){
if (i <= r[l[i] - 1]) {
r[i] = r[l[i] - 1];
l[i] = l[l[i] - 1];
break;
}
flag = 1;
l[i] = l[l[i] - 1];
}
if (r[i] < n && check(b[r[i]], l[i], r[i])){
flag = 1;
r[i] = r[r[i] + 1];
}
if (!flag)break;
}
}
while (q--){
int x, y;
cin >> x >> y;
if (l[x] <= y && y <= r[x])cout << "Yes" << endl;
else cout << "No" << endl;
}
}
signed main(){
#ifdef FSLSE
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
clock_t start = clock();
#endif
IOS;
init(N - 10);
int T;
cin >> T;
while (T--){
solve();
}
#ifdef FSLSE
cout << clock() - start << endl;
#endif
return 0;
}
Ironforge
最新推荐文章于 2024-05-19 16:12:42 发布