#include using namespace std; /* Subtask 3 (Full): Dùng DSU (Union-Find) với path compression. Độ phức tạp: O((N+Q) α(N)) */ struct DSU { vector parent, rankv; DSU(int n) { parent.resize(n+1); rankv.assign(n+1, 0); for (int i = 1; i <= n; i++) parent[i] = i; } int find(int x) { if (parent[x] != x) parent[x] = find(parent[x]); return parent[x]; } void unite(int a, int b) { int ra = find(a), rb = find(b); if (ra == rb) return; if (rankv[ra] < rankv[rb]) parent[ra] = rb; else { parent[rb] = ra; if (rankv[ra] == rankv[rb]) rankv[ra]++; } } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; cin >> N >> Q; DSU dsu(N); vector P(N+1); for (int i = 1; i <= N; i++) { cin >> P[i]; if (P[i] != -1) dsu.unite(i, P[i]); } while (Q--) { int A, B; cin >> A >> B; cout << (dsu.find(A) == dsu.find(B) ? "Yes\n" : "No\n"); } return 0; }