#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
struct unionFind{
int * d;
int N;
int M;
inline void malloc ( const int n) {
d = ( int * ) std:: malloc ( n* sizeof ( int ) ) ;
M = n;
}
inline void malloc ( const int n, const int fg) {
d = ( int * ) std:: malloc ( n* sizeof ( int ) ) ;
M = n;
if ( fg) {
init( n) ;
}
}
inline void free ( void ) {
std:: free ( d) ;
}
inline void walloc( const int n, void ** mem= & wmem) {
walloc1d( & d, n, mem) ;
M = n;
}
inline void walloc( const int n, const int fg, void ** mem= & wmem) {
walloc1d( & d, n, mem) ;
M = n;
if ( fg) {
init( n) ;
}
}
inline void init( const int n) {
int i;
N = n;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
d[ i] = - 1 ;
}
}
inline void init( void ) {
init( M) ;
}
inline int get( int a) {
int t = a;
int k;
while ( d[ t] >= 0 ) {
t= d[ t] ;
}
while ( d[ a] >= 0 ) {
k= d[ a] ;
d[ a] = t;
a= k;
}
return a;
}
inline int connect( int a, int b) {
if ( d[ a] >= 0 ) {
a= get( a) ;
}
if ( d[ b] >= 0 ) {
b= get( b) ;
}
if ( a== b) {
return 0 ;
}
if ( d[ a] < d[ b] ) {
d[ a] + = d[ b] ;
d[ b] = a;
}
else {
d[ b] + = d[ a] ;
d[ a] = b;
}
return 1 ;
}
inline int operator( ) ( int a) {
return get( a) ;
}
inline int operator( ) ( int a, int b) {
return connect( a,b) ;
}
inline int & operator[ ] ( const int a) {
return d[ a] ;
}
inline int size( int a) {
a = get( a) ;
return - d[ a] ;
}
inline int sizeList( int res[ ] ) {
int i;
int sz= 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( d[ i] < 0 ) {
res[ sz++ ] = - d[ i] ;
}
}
return sz;
}
}
;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
class Solution{
public :
vector< bool > areConnected( int n, int t, vector< vector< int >> & queries) {
int i;
dummy_main( ) ;
unionFind uf;
vector< bool > res;
uf.walloc ( n+ 1 ,1 ) ;
for ( i= ( t+ 1 ) ; i< ( n+ 1 ) ; i++ ) {
int j;
for ( j= ( i) ; j< ( n+ 1 ) ; j+ = ( i) ) {
uf( i,j) ;
}
}
for ( vector< int > q : queries) {
res.push_back ( uf( q[ 0 ] ) == uf( q[ 1 ] ) ) ;
}
return res;
}
}
;
// cLay varsion 20201018-2
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// vector<bool> areConnected(int n, int t, vector<vector<int>>& queries) {
// dummy_main();
// unionFind uf;
// vector<bool> res;
// uf.walloc(n+1,1);
// rep(i,t+1,n+1) rep(j,i,n+1,i) uf(i,j);
// for(VI q : queries) res.push_back(uf(q[0]) == uf(q[1]));
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQqd21lbTsKY2hhciBtZW1hcnJbOTYwMDAwMDBdOwp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeCwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICBzdGF0aWMgaW50IHNraXBbMTZdID0gezAsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDF9OwogICgqbWVtKSA9ICh2b2lkKikoICgoY2hhciopKCptZW0pKSArIHNraXBbKCh1bnNpZ25lZCBsb25nIGxvbmcpKCptZW0pKSAmIDE1XSApOwogICgqYXJyKT0oVCopKCptZW0pOwogICgqbWVtKT0oKCphcnIpK3gpOwp9CnN0cnVjdCB1bmlvbkZpbmR7CiAgaW50KmQ7CiAgaW50IE47CiAgaW50IE07CiAgaW5saW5lIHZvaWQgbWFsbG9jKGNvbnN0IGludCBuKXsKICAgIGQgPSAoaW50KilzdGQ6Om1hbGxvYyhuKnNpemVvZihpbnQpKTsKICAgIE0gPSBuOwogIH0KICBpbmxpbmUgdm9pZCBtYWxsb2MoY29uc3QgaW50IG4sIGNvbnN0IGludCBmZyl7CiAgICBkID0gKGludCopc3RkOjptYWxsb2MobipzaXplb2YoaW50KSk7CiAgICBNID0gbjsKICAgIGlmKGZnKXsKICAgICAgaW5pdChuKTsKICAgIH0KICB9CiAgaW5saW5lIHZvaWQgZnJlZSh2b2lkKXsKICAgIHN0ZDo6ZnJlZShkKTsKICB9CiAgaW5saW5lIHZvaWQgd2FsbG9jKGNvbnN0IGludCBuLCB2b2lkICoqbWVtPSZ3bWVtKXsKICAgIHdhbGxvYzFkKCZkLCBuLCBtZW0pOwogICAgTSA9IG47CiAgfQogIGlubGluZSB2b2lkIHdhbGxvYyhjb25zdCBpbnQgbiwgY29uc3QgaW50IGZnLCB2b2lkICoqbWVtPSZ3bWVtKXsKICAgIHdhbGxvYzFkKCZkLCBuLCBtZW0pOwogICAgTSA9IG47CiAgICBpZihmZyl7CiAgICAgIGluaXQobik7CiAgICB9CiAgfQogIGlubGluZSB2b2lkIGluaXQoY29uc3QgaW50IG4pewogICAgaW50IGk7CiAgICBOID0gbjsKICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBkW2ldID0gLTE7CiAgICB9CiAgfQogIGlubGluZSB2b2lkIGluaXQodm9pZCl7CiAgICBpbml0KE0pOwogIH0KICBpbmxpbmUgaW50IGdldChpbnQgYSl7CiAgICBpbnQgdCA9IGE7CiAgICBpbnQgazsKICAgIHdoaWxlKGRbdF0+PTApewogICAgICB0PWRbdF07CiAgICB9CiAgICB3aGlsZShkW2FdPj0wKXsKICAgICAgaz1kW2FdOwogICAgICBkW2FdPXQ7CiAgICAgIGE9azsKICAgIH0KICAgIHJldHVybiBhOwogIH0KICBpbmxpbmUgaW50IGNvbm5lY3QoaW50IGEsIGludCBiKXsKICAgIGlmKGRbYV0+PTApewogICAgICBhPWdldChhKTsKICAgIH0KICAgIGlmKGRbYl0+PTApewogICAgICBiPWdldChiKTsKICAgIH0KICAgIGlmKGE9PWIpewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmKGRbYV0gPCBkW2JdKXsKICAgICAgZFthXSArPSBkW2JdOwogICAgICBkW2JdID0gYTsKICAgIH0KICAgIGVsc2V7CiAgICAgIGRbYl0gKz0gZFthXTsKICAgICAgZFthXSA9IGI7CiAgICB9CiAgICByZXR1cm4gMTsKICB9CiAgaW5saW5lIGludCBvcGVyYXRvcigpKGludCBhKXsKICAgIHJldHVybiBnZXQoYSk7CiAgfQogIGlubGluZSBpbnQgb3BlcmF0b3IoKShpbnQgYSwgaW50IGIpewogICAgcmV0dXJuIGNvbm5lY3QoYSxiKTsKICB9CiAgaW5saW5lIGludCYgb3BlcmF0b3JbXShjb25zdCBpbnQgYSl7CiAgICByZXR1cm4gZFthXTsKICB9CiAgaW5saW5lIGludCBzaXplKGludCBhKXsKICAgIGEgPSBnZXQoYSk7CiAgICByZXR1cm4gLWRbYV07CiAgfQogIGlubGluZSBpbnQgc2l6ZUxpc3QoaW50IHJlc1tdKXsKICAgIGludCBpOwogICAgaW50IHN6PTA7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgaWYoZFtpXTwwKXsKICAgICAgICByZXNbc3orK10gPSAtZFtpXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN6OwogIH0KfQo7CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgdmVjdG9yPGJvb2w+IGFyZUNvbm5lY3RlZChpbnQgbiwgaW50IHQsIHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIHF1ZXJpZXMpewogICAgaW50IGk7CiAgICBkdW1teV9tYWluKCk7CiAgICB1bmlvbkZpbmQgdWY7CiAgICB2ZWN0b3I8Ym9vbD4gcmVzOwogICAgdWYud2FsbG9jKG4rMSwxKTsKICAgIGZvcihpPSh0KzEpO2k8KG4rMSk7aSsrKXsKICAgICAgaW50IGo7CiAgICAgIGZvcihqPShpKTtqPChuKzEpO2orPShpKSl7CiAgICAgICAgdWYoaSxqKTsKICAgICAgfQogICAgfQogICAgZm9yKHZlY3RvcjxpbnQ+IHEgOiBxdWVyaWVzKXsKICAgICAgcmVzLnB1c2hfYmFjayh1ZihxWzBdKSA9PSB1ZihxWzFdKSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDIwMTAxOC0yCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIHZlY3Rvcjxib29sPiBhcmVDb25uZWN0ZWQoaW50IG4sIGludCB0LCB2ZWN0b3I8dmVjdG9yPGludD4+JiBxdWVyaWVzKSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vICAgICB1bmlvbkZpbmQgdWY7Ci8vICAgICB2ZWN0b3I8Ym9vbD4gcmVzOwovLyAgICAgdWYud2FsbG9jKG4rMSwxKTsKLy8gICAgIHJlcChpLHQrMSxuKzEpIHJlcChqLGksbisxLGkpIHVmKGksaik7Ci8vICAgICBmb3IoVkkgcSA6IHF1ZXJpZXMpIHJlcy5wdXNoX2JhY2sodWYocVswXSkgPT0gdWYocVsxXSkpOwovLyAgICAgcmV0dXJuIHJlczsKLy8gICB9Ci8vIH07Cg==