Problem p02585 (python)

Fixed submission:
import sys

sys.setrecursionlimit(10 ** 8)

input = sys.stdin.readline


def main():
    N, K = [int(x) for x in input().split()]
    P = [int(x) - 1 for x in input().split()]
    C = [int(x) for x in input().split()]

    ans = max(C)
    for i in range(N):
        next = P[i]
        cnt = 0
        tmp = 0

        while True:
            tmp += C[next]
            ans = max(ans, tmp)
            cnt += 1
            if cnt == K or next == i:
                break
            next = P[next]

        if cnt == K or tmp <= 0:
            continue

        q = K // cnt
        r = K % cnt
        next = P[i]
        if q != 0:
            tmp *= (q - 1)
            q -= 1
            r += cnt
            ans = max(ans, tmp)
        else:
            tmp = 0
        while r > 0:
            tmp += C[next]
            ans = max(ans, tmp)
            next = P[next]
            r -= 1
    print(ans)


if __name__ == '__main__':
    main()

Buggy submission (verdict: Runtime Error):
import sys

sys.setrecursionlimit(10 ** 8)

input = sys.stdin.readline


def main():
    N, K = [int(x) for x in input().split()]
    P = [int(x) for x in input().split()]
    C = [int(x) for x in input().split()]

    score = [[0] for j in range(N)]

    dic = {}

    for i in range(N):
        next = P[i] - 1
        visited = set()
        j = 0
        memo = {}
        while next not in visited:
            score[i].append(C[next] + score[i][-1])
            visited.add(next)
            memo[next] = j
            j += 1
            next = P[next] - 1
        dic[i] = (next - 1, len(score[i]) - memo[next] - 1)

    # print(score)
    # print(dic)
    ans = max(C)
    for i in range(N):
        if K <= len(score[i]) - 1:
            ans = max(ans, max(score[i][1:K + 1]))
        else:
            if score[i][-1] <= 0:
                ans = max(ans, max(score[i][1:K + 1]))
            else:
                q, r = divmod(K - (len(score[i]) - 1), dic[i][1])
                tmp = score[i][-1]
                tmp += q * (score[i][-1] - score[i][-1 - (dic[i][1])])
                if max(score[i][-1 - (dic[i][1] - 1):-1 - (dic[i][1] - 1) + r]) - score[i][-1 - dic[i][1]] > 0:
                    tmp += max(score[i][-1 - (dic[i][1] - 1):-1 - (dic[i][1] - 1) + r]) - score[i][-1 - dic[i][1]]
                ans = max(ans, tmp)

    print(ans)


if __name__ == '__main__':
    main()

Buggy submission (verdict: Runtime Error):
import sys

sys.setrecursionlimit(10 ** 8)

input = sys.stdin.readline


def main():
    N, K = [int(x) for x in input().split()]
    P = [int(x) for x in input().split()]
    C = [int(x) for x in input().split()]

    score = [[0] for j in range(N)]

    dic = {}

    for i in range(N):
        next = P[i] - 1
        visited = set()
        j = 0
        memo = {}
        while next not in visited:
            score[i].append(C[next] + score[i][-1])
            visited.add(next)
            memo[next] = j
            j += 1
            next = P[next] - 1
        dic[i] = (next - 1, len(score[i]) - memo[next] - 1)

    # print(score)
    # print(dic)
    ans = max(C)
    for i in range(N):
        if K <= len(score[i]) - 1:
            ans = max(ans, max(score[i][1:K + 1]))
        else:
            if score[i][-1] <= 0:
                ans = max(ans, max(score[i][1:K + 1]))
            else:
                q, r = divmod(K - (len(score[i]) - 1), dic[i][1])
                tmp = score[i][-1]
                tmp += q * (score[i][-1] - score[i][-1 - (dic[i][1])])
                if max(score[i][-1 - (dic[i][1] - 1):-1 - (dic[i][1] - 1) + r]) - score[i][-1 - dic[i][1]] > 0:
                    tmp += max(score[i][-1 - (dic[i][1] - 1):-1 - (dic[i][1] - 1) + r]) - score[i][-1 - dic[i][1]]
                ans = max(ans, tmp)

    print(ans)


if __name__ == '__main__':
    main()