//In the name of ALLAH #include using namespace std; typedef long long ll; typedef vector vi; typedef vector vl; typedef vector vvi; typedef vector vvl; typedef pair pii; typedef pair pdd; typedef pair pll; typedef vector vii; typedef vector vll; typedef double dl; #define PB push_back //#define PB emplace_back #define F first #define S second #define MP make_pair #define endl '\n' #define all(a) (a).begin(),(a).end() #define sz(x) (int)x.size() #define mid(l,r) ((r+l)/2) #define left(node) (node*2) #define right(node) (node*2+1) #define mx_int_prime 999999937 const double PI = acos(-1); const double eps = 1e-9; const int inf = 2000000000; const ll infLL = 9000000000000000000; #define MOD 1000000007 //#define harmonic(n) 0.57721566490153286l+log(n) #define mem(a,b) memset(a, b, sizeof(a) ) #define gcd(a,b) __gcd(a,b) #define sqr(a) ((a) * (a)) #define optimize() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define fraction() cout.unsetf(ios::floatfield); cout.precision(10); cout.setf(ios::fixed,ios::floatfield); #define file() freopen("input.txt","r",stdin);freopen("output.txt","w",stdout); typedef vector::iterator vit; typedef set::iterator sit; inline bool checkBit(ll n, int i) { return n&(1LL<>= 1; } return r; } inline ll modInverse(ll a) { return modPow(a, MOD-2); } inline ll modDiv(ll a, ll b) { return modMul(a, modInverse(b)); } /* bool seive[1010000]; vi prime; void seiveGen(int limit) { limit += 100; int sqrtn = sqrt(limit); for(int i = 3; i <= sqrtn; i += 2) { if(!seive[i>>1]) { for(int j = i * i; j < limit; j += i + i) { seive[j>>1] = 1; } } } prime.PB(2); for(int i = 3; i < limit; i += 2) { if(!seive[i>>1]) prime.PB(i); } } */ // //debug //#ifdef template < typename F, typename S > ostream& operator << ( ostream& os, const pair< F, S > & p ) { return os << "(" << p.first << ", " << p.second << ")"; } template < typename T > ostream &operator << ( ostream & os, const vector< T > &v ) { os << "{"; for(auto it = v.begin(); it != v.end(); ++it) { if( it != v.begin() ) os << ", "; os << *it; } return os << "}"; } template < typename T > ostream &operator << ( ostream & os, const set< T > &v ) { os << "["; for(auto it = v.begin(); it != v.end(); ++it) { if( it != v.begin() ) os << ", "; os << *it; } return os << "]"; } template < typename T > ostream &operator << ( ostream & os, const multiset< T > &v ) { os << "["; for(auto it = v.begin(); it != v.end(); ++it) { if( it != v.begin() ) os << ", "; os << *it; } return os << "]"; } template < typename F, typename S > ostream &operator << ( ostream & os, const map< F, S > &v ) { os << "["; for(auto it = v.begin(); it != v.end(); ++it) { if( it != v.begin() ) os << ", "; os << it -> first << " = " << it -> second ; } return os << "]"; } #define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0) clock_t tStart = clock(); #define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC) void faltu () { cerr << endl; } template void faltu( T a[], int n ) { for(int i = 0; i < n; ++i) cerr << a[i] << ' '; cerr << endl; } template void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); } //#else //#define dbg(args...) const int mx = 1e5+123; struct info { int MX, MN; }t[mx*3]; int p[mx][30], chainHead[mx], chainInd[mx], chainNo, ptr, basePos[mx],baseArry[mx], parent[mx], level[mx], n, sz[mx]; vii Aj[mx]; void init ( int id, int b, int e ) { if ( b == e ) { t[id].MN = t[id].MX = baseArry[b]; return; } int mid = ( b + e ) >> 1; init ( id*2, b, mid ); init ( id*2+1, mid+1, e ); t[id].MN = min ( t[id*2].MN, t[id*2+1].MN ); t[id].MX = max ( t[id*2].MX, t[id*2+1].MX ); } info ask ( int id, int b, int e, int i, int j ) { info ret; ret.MN = 1, ret.MX = -1; if ( b > j || e < i ) return ret; if ( b >= i && e <= j ) return t[id]; int mid = ( b + e ) >> 1; info ret1 = ask ( id*2, b, mid, i, j ); info ret2 = ask ( id*2+1, mid+1, e, i, j ); ret.MN = min ( ret1.MN, ret2.MN ); ret.MX = max ( ret1.MX, ret2.MX ); return ret; } int dfs ( int u, int lev ) { level[u] = lev; sz[u] = 1; for ( int i = 0; i < sz (Aj[u]); i ++ ) { pii v = Aj[u][i]; if ( parent[u] != v.F ) { parent[v.F] = u; sz[u] += dfs ( v.F, lev+1 ); } } return sz[u]; } void preprocess() { for ( int i = 1; i <= n; i++ ) p[i][0] = parent[i]; for ( int j = 1; ( 1 << j ) <= n; j++ ) { for ( int i = 1; i <= n; i++ ) { if ( p[i][j-1] != -1 ) p[i][j] = p[p[i][j-1]][j-1]; } } } int LCA ( int u, int v ) { if ( level[u] < level[v] ) swap ( u, v ); int dist = level[u] - level[v]; while ( dist > 0 ) { int rise = log2 ( dist ); u = p[u][rise]; dist -= ( 1 << rise ); } if ( u == v ) return u; for ( int i = 20; i >= 0; i-- ) { if ( p[u][i] != p[v][i] && p[u][i] != -1 ) { u = p[u][i]; v = p[v][i]; } } return parent[u]; } void HLD ( int u, int cost ) { if ( chainHead[chainNo] == -1 ) { chainHead[chainNo] = u; } chainInd[u] = chainNo; basePos[u] = ++ptr; baseArry[ptr] = cost; int m = -1, id = -1, c = -1; for ( auto v : Aj[u] ) { if ( sz[v.F] > m && v.F != parent[u] ) { m = sz[v.F], id = v.F, c = v.S; } } if ( id != -1 ) HLD ( id, c ); for ( auto v : Aj[u] ) { if ( parent[u] != v.F && v.F != id ) { chainNo++; HLD ( v.F, v.S ); } } } info query_up ( int u, int v, int c ) { info ret; ret.MN = 1, ret.MX = -1; int chainU, chainV = chainInd[v], ans = 0; if ( v == u ) { ret.MX = ret.MN = c; return ret; } while ( 1 ) { chainU = chainInd[u]; if ( chainU == chainV ) { if ( u == v ) return ret; info ret1 = ask ( 1, 1, ptr, basePos[v]+1, basePos[u] ); ret.MN = min ( ret.MN, ret1.MN ); ret.MX = max ( ret.MX, ret1.MX ); return ret; } info ret1 = ask ( 1, 1, ptr, basePos[chainHead[chainU]], basePos[u] ); ret.MN = min ( ret.MN, ret1.MN ); ret.MX = max ( ret.MX, ret1.MX ); u = chainHead[chainU]; u = parent[u]; } } bool query ( int u, int v ) { int lca = LCA ( u, v ); info ret1 = query_up( u, lca, -1 ); info ret2 = query_up( v, lca, 1 ); return ( ret1.MX == ret1.MN && ret1.MN == -1 && ret2.MN == 1 && ret2.MN == ret2.MX ); } int main() { optimize(); mem ( p, -1 ); mem ( chainHead, -1 ); ptr = 0, chainNo = 1; int u, v; cin >> n; for ( int i = 1; i < n; i++ ) { cin >> u >> v; Aj[u].PB ( { v, 1 } ); Aj[v].PB ( { u, -1 } ); } dfs ( 1, 0 ); preprocess(); HLD ( 1, -1 ); init ( 1, 1, ptr ); int q; cin >> q; while ( q-- ) { cin >> u >> v; if ( query( u, v ) ) cout << "Yes\n"; else cout << "No\n"; } return 0; }