#!/usr/bin/python3 def intlist(): """Přečte řádek mezerou oddělených čísel a vrátí ho jako seznam""" return list(map(int, input().split())) # Načteme N a M na prvním řádku N, M = intlist() # Načteme N řádků s kamarády kamaradi = [intlist() for i in range(N)] def spocti_podrizene(vedouci, kamaradi): """Pokud vedouci bude vedoucím, kolik bude mít každý pracovník pomocníků?""" podrizenych = [0] * N # Počty podřízených patro = [vedouci] # Seznam všech pracovníků v jednom patře hiearchie, tedy # ve stejné vzdálenosti od vedoucího rozrazeno = [False] * N # Zda už jsme daného člověka zařadili (a víme, kdo je jeho nadřízený) rozrazeno[vedouci] = True # Vedoucí nemá nadřízeného, tedy už jsme ho v podstatě zařadili while patro: # Dokud je v aktuálním patře aspoň jeden pracovník patro.sort() # Seřadíme pracovníky od nejmenšího čísla dalsi_patro = [] for v in patro: # Projedeme všechny pracovníky z patra for u in kamaradi[v]: # Projdeme všechny jeho kamarády if rozrazeno[u]: continue # Žák už má nadřízeného, nezajímá nás # Jinak žákovi nastavíme za nadřízeného aktuálního pracovníka, # tedy započítáme ho do podřízených podrizenych[v] += 1 # Přidáme žáka do nové vrstvy, nastavíme, že jsme ho zpracovali dalsi_patro.append(u) rozrazeno[u] = True patro = dalsi_patro # Přesuneme se o patro níž return podrizenych for i in range(M): vedouci, zajima_nas = intlist() podrizenych = spocti_podrizene(vedouci, kamaradi) # podrizenych[v] ... kolik ma pracovník v podřízených při vedoucím vedouci print(podrizenych[zajima_nas])