グラフに対するクエリ処理

K - 巨大企業

O(N)

import sys
import math
import heapq
import itertools
from collections import deque
from functools import reduce

sys.setrecursionlimit(1000000)

# main
def main():
    N = int(input())
    R = -1
    edges = []
    for i in range(N):
        edges.append([])

    for i in range(N):
        p = int(input())
        if p == -1:
            R = i
        else:
            edges[p-1].append(i)

    gueries = []
    for i in range(N):
        gueries.append([])

    Q = int(input())
    for q in range(Q):
        a, b = list(map(int, input().split()))
        gueries[a-1].append([q, b-1])

    ans=[False]*Q
    boss=[False]*N

    def dfs(i):
        for q, b in gueries[i]:
            ans[q] = boss[b]

        boss[i] = True
        for j in edges[i]:
            dfs(j)

        boss[i] = False
    
    dfs(R)

    for q in range(Q):
        if ans[q]:
            print("Yes")
        else:
            print("No")

# エントリポイント
if __name__ == '__main__':
    main()