#pragma GCC optimize("O2") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define whlie while #define retunr return #define reutrn return #define reutnr return #define mp make_pair #define pb push_back #define eb emplace_back #define fi first #define se second #define inf 1001001001 #define MOD 998244353 #define infLL (1LL << 61) #define FOR(i,a,b) for(int (i)=(int)(a); (i)<(int)(b); (i)++) // [a,b) #define rep(i,N) FOR((i), 0, (int)(N)) // [0,N) #define FORR(i,a,b) for(int (i)=(int)(b) - 1; (i)>=(int)(a); (i)--) #define repr(i,N) FORR((i), 0, (int)(N)) #define each(x,v) for(auto &x : v) #define all(v) (v).begin(),(v).end() #define sz(v) ((int)(v).size()) #define vrep(v,it) for(auto it=v.begin();it!=v.end();it++) #define vrepr(v,it) for(auto it=v.rbegin();it!=v.rend();it++) #define ini(...) int __VA_ARGS__; in(__VA_ARGS__) #define inl(...) ll __VA_ARGS__; in(__VA_ARGS__) #define inc(...) char __VA_ARGS__; in(__VA_ARGS__) #define ins(...) string __VA_ARGS__; in(__VA_ARGS__) #define ind(...) double __VA_ARGS__; in(__VA_ARGS__) #define inpii(...) pii __VA_ARGS__; in(__VA_ARGS__) //#define rand mtrand //#define randinit random_device seed_gen; mt19937_64 mtrand(seed_gen()) #ifdef LOCAL #define trc(...) do { cout << #__VA_ARGS__ << " = "; dbg_out(__VA_ARGS__);} while(0) #define stopif(val) assert( !(val) ) #define trcv(v,...) do { cout << #v << " = "; vector_debug(v , ##__VA_ARGS__);cout << endl;} while(0) #else #define trc(...) #define stopif(...) #define trcv(...) #endif using namespace std; using ll = long long; using pii = pair; using pll = pair; using vi = vector; using vl = vector; using vs = vector; using vpii = vector; using vvi = vector< vector >; struct IoSetupNya {IoSetupNya() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(15); cerr << fixed << setprecision(15);} } iosetupnya; /* int gcd(int a, int b){if(a>b) swap(a,b); return a==0 ? b : gcd(b%a,a);} ll gcd(ll a, ll b){if(a>b) swap(a,b); return a==0 ? b : gcd(b%a,a);} ll lcm(int a, int b){return (1LL * a / gcd(a,b)) * b;} ll lcm(ll a, ll b){return (a / gcd(a,b)) * b;} */ inline ll pow(int a, int b){ll ans = 1; rep(i,b) ans *= a; return ans;} inline ll pow(ll a, ll b){ll ans = 1; rep(i,b) ans*= a; return ans;} inline ll pow(int a, ll b){ll ans = 1; rep(i,b) ans *= a; return ans;} inline ll pow(ll a, int b){ll ans = 1; rep(i,b) ans*= a; return ans;} template inline bool amin(T &x, U y) { return (y < x) ? (x = y, true) : false; } template inline bool amax(T &x, U y) { return (x < y) ? (x = y, true) : false; } template inline void _cin(C &c){cin >> c;} template inline void _cin(pair &p){cin >> p.fi; cin >> p.se;} template inline void _cout(const C &c){cout << c;} template inline void _cout(const pair &p){cout << p.fi << ' ' << p.se;} void in(){} template void in(T &t,U &...u){ _cin(t); in(u...);} void out(){cout << "\n";} template void out(const T &t,U ...u){ _cout(t); if(sizeof...(u)) cout << ' '; out(u...);} template inline void in(vector &v,int N=-1){if(sz(v) != 0){int M=(N == -1) ? sz(v) : N; rep(i,M) _cin(v[i]);}else{C c;rep(i,N) v.pb((_cin(c),c));}} template inline void in(C v[],int N){rep(i,N) _cin(v[i]);} template inline void out(const vector &v,int N=-1){int M=(N == -1) ? sz(v) : N; rep(i,M) {cout<<( (i)?" ":"" ); _cout(v[i]);} cout<<"\n";} template inline void out(C v[],int N){rep(i,N) {cout<<( (i)?" ":"" ); _cout(v[i]);} cout<<"\n";} template inline void vector_debug(const vector &v,int N=-1){cout << "{"; int M=(N == -1) ? sz(v) : N; rep(i,M) {cout<<( (i)?", ":"" ); _cout(v[i]);} cout<<"}";} template inline void vector_debug(C v[], int N){cout << "{"; rep(i,N) {cout<<((i)?", ":""); _cout(*(v+i));} cout<<"}";} void dbg_out(){cout << endl;} template void dbg_out(const T &t,U ...u){ _cout(t); if(sizeof...(u)) cout << ", "; dbg_out(u...);} template void dbg_out(const vector &v,U ...u){vector_debug(v); if(sizeof...(u)) cout << ", "; dbg_out(u...);} template void dbg_out(const vector> &v,U ...u){cout << "{ "; rep(i,sz(v)) {if(i)cout<<", "; vector_debug(v[i]);} cout << " }"; if(sizeof...(u)) cout << ", "; dbg_out(u...);} template inline C vmax(const vector &v){C n=v[0]; rep(i,sz(v)) amax(n,v[i]); return n;} template inline C vmax(C v[], int N){C n=v[0]; rep( i , N ) amax(n,v[i]); return n;} template inline C vmin(const vector &v){C n=v[0]; rep(i,sz(v)) amin(n,v[i]); return n;} template inline C vmin(C v[], int N){C n=v[0]; rep( i , N ) amin(n,v[i]); return n;} void die(string s){out(s); exit(0);} //////////// /// main /// //////////// // 1からNまでの素数を判定するライブラリ // A[i] == 1 <-> iは素数 void prime(vi& A,int N){ rep(i,N + 1) A[i] = 1; A[0] = 0; A[1] = 0; for(int i=2 ; i*i <= N ; i++){ if(A[i]){ for(int j=2; i*j <= N; j++){ A[i*j] = 0; } } } } // 省メモリセグ木 使いどころある? ないですね(完) template struct ST{ int size; vector seg; F func; vector seg_sz; ST(){}; ST(const vector &v,F func) : func(func){ // initialize seg.resize( ( size = v.size() ) << 1 , UNIT); // set // n A[n]まで見た int n = 0; seg_sz.pb(0); while(n < size){ // これからm個の配列を埋める int m = 1 << (31 - __builtin_clz(size ^ n) ); for(int i = n; i < n + m; i++){ //trc(n , m , i); seg[n + m + i] = v[i]; } seg_sz.pb( (n += m) ); } // build(); } void build(){ vector::const_iterator it = seg_sz.begin(); while(1){ int l = *(it++); if(it == seg_sz.end()) return; int r = *it; const int dif = l << 1; // k 添え字のズレ for( int i = r - l - 1; i > 0; i-- ){ seg[dif | i] = func(seg[dif | (i << 1)] , seg[dif | (i << 1) | 1]); } } } void update(int k, T& x){ vector::const_iterator it = upper_bound(seg_sz.begin() , seg_sz.end() , k); seg[ (k += *it) ] = x; it--; k -= (*it) << 1; const int dif = (*it) << 1; //trc(k , dif); // [*it , *(it + 1) ) 間のセグ木を更新 添え字はdifずれている while(k >>= 1){ seg[dif | k] = func(seg[dif | (k << 1)] , seg[dif | (k << 1) | 1]); } } // [a,b)へのクエリ T query(int a, int b){ //trc("query" , a , b); if(a < 0){a = 0;} b--; // いったん閉区間にする // おなじセグ木に乗せる処理 T ret = UNIT; vector::const_iterator itl = upper_bound(seg_sz.begin() , seg_sz.end() , a), itr = upper_bound(seg_sz.begin() , seg_sz.end() , b); itl--; const int cur_sz = *(itr--) - *itr;// 右側の載っているセグ木のサイズ //trc(ret , *itl , *itr); while(itl != itr) { if(a == *itl) ret = func(ret , seg[ ( (*itl++) << 1 ) | 1 ]); else ret = func(ret , query(a , (*(++itl))) ); a = *itl; //trc(ret , *itl , *itr); } const int dif = (*itr) << 1; // 普通のセグ木の処理 セグ木のサイズはcur_sz a,bは添え字はdifずれる T L = UNIT, R = UNIT; for( a += cur_sz - *itr , b += cur_sz + 1 - *itr ; a>=1,b>>=1){ if(a & 1) L = func(L,seg[dif | (a++)]); if(b & 1) R = func(seg[dif | (--b)],R); } return func(ret , func(L, R) ); } T operator[](const int &k) const{ vector::const_iterator it = upper_bound(seg_sz.begin() , seg_sz.end() , k); return seg[ *it + k ]; } }; auto f = [](int a,int b){return a + b;}; int main(){ ini(N); vi a(N); in(a,N); ini(Q); vi P(Q),L(Q),R(Q); rep(i,Q) in(P[i],L[i],R[i]); vi A(2001); prime(A , 2000); vi lst; lst.reserve(1000); int nyanya = 0; rep(i,2001) if(A[i] == 1) { A[i] = nyanya++; lst.pb(i); } trc(sz(lst)); vvi data(303 , vi(N , 0)); rep(i,N){ rep(j,303){ if(a[i] == 0) data[j][i] = -20000; else while(a[i] % lst[j] == 0){ data[j][i]++; a[i] /= lst[j]; } } } //out("hoe"); vector< ST > st; st.reserve(303); rep(i,303){ st.pb(ST(data[i] , f)); } rep(i,Q){ int hoge = P[i]; rep(j,303){ int p = lst[j]; while(hoge % p == 0) hoge /= p; } if(hoge != 1) {out("NO"); continue;} repr(j,303){ int p = lst[j]; if(p > P[i]) continue; if(P[i] == 1) break; if(P[i] % p != 0) continue; int cur = st[j].query(L[i] - 1 , R[i]); while(cur > 0){ if(P[i] % p != 0) break; P[i] /= p; cur--; } if(P[i] == 1 || P[i] % p == 0) break; } out(P[i] == 1 ? "Yes" : "NO"); } }