import sys from itertools import permutations import heapq from collections import deque import random input = lambda :sys.stdin.readline().rstrip() mi = lambda :map(int,input().split()) li = lambda :list(mi()) N = int(input()) A = li() B = li() C = li() C = [c-1 for c in C] cycle = [C[i] for i in range(N)] for _ in range(30): cycle = [cycle[cycle[i]] for i in range(N)] cycle = set(cycle) comp_cycle = [i for i in range(N)] for i in range(N): if i not in cycle or comp_cycle[i]!=i: continue t = len(comp_cycle) tmp = [i] while True: nxt = C[tmp[-1]] if nxt!=i: tmp.append(nxt) else: break for v in tmp: comp_cycle[v] = t comp_cycle.append(t) A.append(sum([A[i] for i in tmp])) B.append(sum([B[i] for i in tmp])) n = len(comp_cycle) edge = [[] for v in range(n)] parent = [-1] * n for i in range(N): if comp_cycle[i]!=i: continue parent[comp_cycle[i]] = comp_cycle[C[i]] edge[comp_cycle[C[i]]].append(comp_cycle[i]) topo = [] for root in range(N,n): deq = deque([root]) while deq: v = deq.popleft() topo.append(v) for nv in edge[v]: deq.append(nv) dp = [-1] * n def cond(k): for v in topo[::-1]: dp[v] = k * B[v] for nv in edge[v]: dp[v] += dp[nv] if dp[v] > A[v]: dp[v] -= A[v] else: dp[v] = 0 for root in range(N,n): if dp[root]: return False return True ok = 0 ng = 10**15 + 1 while ng-ok>1: mid = (ok+ng)//2 if cond(mid): ok = mid else: ng = mid print(ok)