Buggy python submission (verdict: Time Limit Exceeded):
N, K = map(int, input().split())
P = list(map(int, input().split()))
C = list(map(int, input().split()))
P = [p-1 for p in P]

# 1,ループを検出
# 2,ループごとの最大値の計算
# 3,結果の出力

visited = set() #探索済みのものを格納する

ans = 0
for i in range(N):
  if i in visited: #探索済みの場合
    continue
  
  # 1,ループを検出
  j = i
  C_tmp = [] #たどる順番にコストを格納
  while j not in visited:
    C_tmp.append(C[j])
    visited.add(j)
    j = P[j] #次のjへ
    
  # 2,ループごとの最大値の計算
  N_tmp = len(C_tmp) #ループ長さ
  tmp = 0 #何も足さないときは0(これが最大になる可能性もあるので注意)
  
  # N_tmp < K の場合には注意が必要
  # C_tmpの全要素の和が正になるときには、できるだけループを多く回したい
  # C_tmpの全要素の和が負になるときには、１周以内に収めたい
  loop_sum = max(0, sum(C_tmp)) #負の場合にはなかったことにすればよい
  #ただし、これらのうち番号が負になるものや、範囲外のものは当然のぞく
  
  #調べたいのは、
  #  sum(C)が正のとき  操作の回数が K-N_tmp+1 から K まで
  #  sum(C)が負のとき  操作の回数が 0 から N_tmp-1 まで
  #　  例1：N_tmp = 5, K = 8, ループ１周の和が正の時
  #       0 　 1 　 2 　 3 　 4 ◯ （「上段」）
  #       5 ◯ 6 ◯ 7 ◯ 8 ◯   　 （「下段」）
  #　  例2：N_tmp = 5, K = 8, ループ１周の和が負の時
  #       0 ◯ 1 ◯ 2 ◯ 3 ◯ 4 ◯ 
  #       5 　 6 　 7 　 8 　
  #    ただし、ループを１周ごとになかったことにするなら、結局次のように考えて良い
  #       0 　 1 　 2 　 3 　 4 ◯ （「上段」）
  #       5 ◯ 6 ◯ 7 ◯ 8 ◯   　 （「下段」）
  #　  例3：N_tmp = 5, K = 3, ループ１周の和が正の時
  #       0 ◯ 1 ◯ 2 ◯ 3 ◯   　 （「上段」）
  
  #ひとまず、回すことができる最大のループ回数を計算し、その和を求めておく
  base = loop_sum * (K // N_tmp)
  
  #はみ出した部分について和を求める。（「下段」については、loop_sumを一回引くことで対処）
  # (操作回数) % N_tmp を lとして、連続したl個の要素の和を調べる
  ans = max(ans, base) # l = 0 のとき
  behind = False #下段を調べているときにTrueとする
  for l in range(1,min(N_tmp, K+1)): # l > 1 のとき
    if (not behind) and l > K % N_tmp: #下段に移るとき、ループを１週戻す
      behind = True
      base -= loop_sum
    summ = sum(C_tmp[0:l]) + base
    for j in range(N_tmp):
      ans = max(ans, summ) #最大値の更新
      summ += C_tmp[(j+l)%N_tmp] - C_tmp[j] #始点を1ずらす
      
      
#3,結果の出力
# K > 1に注意
print(max(C) if max(C) < 0 else ans)


  
    
    

Fixed submission:
N, K = map(int, input().split())
P = list(map(int, input().split()))
C = list(map(int, input().split()))

P = [p-1 for p in P]
#print(P)

visited = set()
ans = 0
for i in range(N):
  if i in visited:
    continue
  tmp = []
  j = i
  while j not in visited:
    tmp.append(C[j])
    visited.add(j)
    j = P[j]
  #print(tmp,visited)  
  M = len(tmp)
  L = max(0,sum(tmp))
  now = L * (K // M)
  k = K % M
  tmp2 = 0
  tmp4 = 0
  for l in range(1,min(M,K)+1):
    tmp2 += tmp[l-1]
    tmp3 = tmp2
    for j in range(M):
      tmp4 = max(tmp4, tmp3) 
      tmp3 += tmp[(j+l)%M] - tmp[j%M]
      #print(tmp4, l, j)
      ans = max(ans, now+tmp4 if l <= k else now+tmp4-L)
  #ans = max(ans, now+tmp4 if l <= k else now+tmp4-L) 
  #print(i, L, now, l, k, tmp4, M, visited, now+tmp4)
  del tmp

flag = True
for c in C:
  if c > 0:
    flag = False
    
print(max(C) if flag else ans)

Buggy python submission (verdict: Time Limit Exceeded):
N, K = map(int, input().split())
P = list(map(int, input().split()))
C = list(map(int, input().split()))

P = [p-1 for p in P]
#print(P)

visited = set()
ans = 0
for i in range(N):
  if i in visited:
    continue
  tmp = []
  j = i
  while j not in visited:
    tmp.append(C[j])
    visited.add(j)
    j = P[j]
  #print(tmp,visited)  
  M = len(tmp)
  L = max(0,sum(tmp))
  now = L * (K // M)
  k = K % M
  tmp2 = 0
  tmp4 = 0
  for l in range(1,min(M,K)+1):
    tmp2 += tmp[l-1]
    tmp3 = tmp2
    for j in range(M):
      tmp4 = max(tmp4, tmp3) 
      tmp3 += tmp[(j+l)%M] - tmp[j%M]
      #print(tmp4, l, j)
      ans = max(ans, now+tmp4 if l <= k else now+tmp4-L)
  #ans = max(ans, now+tmp4 if l <= k else now+tmp4-L) 
  #print(i, L, now, l, k, tmp4, M, visited, now+tmp4)
  del tmp

flag = True
for c in C:
  if c > 0:
    flag = False
    
print(max(C) if flag else ans)

    
  
    


Fixed submission:
N, K = map(int, input().split())
P = list(map(int, input().split()))
C = list(map(int, input().split()))

P = [p-1 for p in P]
#print(P)

visited = set()
ans = 0
for i in range(N):
  if i in visited:
    continue
  tmp = []
  j = i
  while j not in visited:
    tmp.append(C[j])
    visited.add(j)
    j = P[j]
  #print(tmp,visited)  
  M = len(tmp)
  L = max(0,sum(tmp))
  now = L * (K // M)
  k = K % M
  tmp2 = 0
  tmp4 = 0
  for l in range(1,min(M,K)+1):
    tmp2 += tmp[l-1]
    tmp3 = tmp2
    for j in range(M):
      tmp4 = max(tmp4, tmp3) 
      tmp3 += tmp[(j+l)%M] - tmp[j%M]
      #print(tmp4, l, j)
      ans = max(ans, now+tmp4 if l <= k else now+tmp4-L)
  #ans = max(ans, now+tmp4 if l <= k else now+tmp4-L) 
  #print(i, L, now, l, k, tmp4, M, visited, now+tmp4)
  del tmp

flag = True
for c in C:
  if c > 0:
    flag = False
    
print(max(C) if flag else ans)