#include #include #include #include #include using namespace std; const int maxn = 1000+1; bool mark[maxn]; vector adj[maxn]; bool fnd = false; stack path; void dfsI(int vertex) { mark[vertex] = true; for(int i = 0; i < adj[vertex].size(); i++){ int child = adj[vertex][i]; if(!mark[child]) dfsI(child); } return; } void dfsIi(int vertex, int goal) { mark[vertex] = true; if(!fnd) path.push(vertex); if(vertex == goal) { fnd = true; while(!path.empty()) { cout << path.top()+1 << " "; path.pop(); } cout << endl; } for(int i = 0; i < adj[vertex].size(); i++){ int child = adj[vertex][i]; if(!mark[child]) dfsIi(child, goal); } if(!fnd) path.pop(); return; } void dfsII(int root) { stack dfs; dfs.push(root); while(!dfs.empty()) { int vertex = dfs.top(); dfs.pop(); mark[vertex] = true; for(int i = 0; i < adj[vertex].size(); i++) if(!mark[adj[vertex][i]]) dfs.push(adj[vertex][i]); } return; } void bfs(int root) { queue q; q.push(root); while(!q.empty()) { int vertex = q.front(); q.pop(); mark[vertex] = true; for(int i = 0; i < adj[vertex].size(); i++) if(!mark[adj[vertex][i]]) q.push(adj[vertex][i]); } return; } int main() { int n, m; cin >> n >> m; for(int i = 0; i < m; i++){ int u, v; cin >> u >> v; u--; v--; adj[u].push_back(v); } int q; cin >> q; for(int i = 0; i < q; i++) { int u, v; cin >> u >> v; u--; v--; fill(mark, mark + maxn, false); bfs(u); if(mark[v]) cout << "YESSS" << endl; else cout << "NOPE" << endl; } return 0; }