Problem p02964 (python)

Fixed submission:
import sys
sys.setrecursionlimit(2147483647)
INF=float("inf")
MOD=10**9+7
input=lambda:sys.stdin.readline().rstrip()
def resolve():
    n,k=map(int,input().split())
    A=list(map(int,input().split()))
    idx=[[] for _ in range(max(A)+1)]
    for i,a in enumerate(A):
        idx[a].append(i)

    # いくつ先に移動するかを求める
    next=[None]*n
    for I in idx:
        if(not I): continue
        s=len(I)
        I.append(I[0]+n)
        for i in range(s):
            next[I[i]]=I[i+1]-I[i]+1

    # doubling
    M=10**18 # n*k より大きな数で抑えておく
    nexts=[next]
    for _ in range(60):
        next=nexts[-1]
        nnext=[min(M,next[i]+next[(i+next[i])%n]) for i in range(n)]
        nexts.append(nnext)

    now=0
    for next in nexts[::-1]:
        if(now+next[now%n]<=n*k):
            now+=next[now%n]
    if(now==n*k):
        return

    # A[now%n:] に対してシミュレーションする
    ans=[]
    have=[0]*(max(A)+1)
    for a in A[now%n:]:
        if(not have[a]):
            ans.append(a)
            have[a]=1
        else:
            while(1):
                x=ans.pop()
                have[x]=0
                if(x==a): break

    print(*ans)
resolve()

Buggy submission (verdict: Runtime Error):
import sys
sys.setrecursionlimit(2147483647)
INF=float("inf")
MOD=10**9+7
input=lambda:sys.stdin.readline().rstrip()
def resolve():
    n,k=map(int,input().split())
    A=list(map(int,input().split()))
    idx=[[] for _ in range(max(A)+1)]
    for i,a in enumerate(A):
        idx[a].append(i)
    perm=[None]*n
    for I in idx:
        s=len(I)
        for i in range(s):
            if(i!=s-1): perm[I[i]]=(I[i+1]+1)%n
            else: perm[I[i]]=(I[0]+1)%n

    # perm の 先頭要素をサイクル分解する
    cycle=[0]
    v=perm[0]
    while(v):
        cycle.append(v)
        v=perm[v]

    # 元に戻るまで何周したか -> まずは k をこれで割る
    cycle.append(0)
    cnt=0
    for i in range(len(cycle)-1):
        if(cycle[i+1]<cycle[i] or cycle[i]+1==cycle[i+1]):
            cnt+=1
    k%=cnt

    # k が 0 になるまで消費する
    for i in range(len(cycle)-1):
        s=(cycle[i+1]<cycle[i] or cycle[i]+1==cycle[i+1])
        if(k-s<=0):
            break
        else:
            k-=s

    # cycle[i] 以降の数列について、実際に構成すればよい
    Q=[]
    cnt=[0]*(max(A)+1)
    for a in A[cycle[i]:]:
        if(cnt[a]==0):
            Q.append(a)
            cnt[a]=1
        else:
            while(Q[-1]!=a): Q.pop()
            Q.pop()
            cnt[a]=0
    print(*Q)
resolve()

Buggy submission (verdict: Runtime Error):
import sys
sys.setrecursionlimit(2147483647)
INF=float("inf")
MOD=10**9+7
input=lambda:sys.stdin.readline().rstrip()
def resolve():
    n,k=map(int,input().split())
    A=list(map(int,input().split()))
    idx=[[] for _ in range(max(A)+1)]
    for i,a in enumerate(A):
        idx[a].append(i)
    perm=[None]*n
    for I in idx:
        s=len(I)
        for i in range(s):
            if(i!=s-1): perm[I[i]]=(I[i+1]+1)%n
            else: perm[I[i]]=(I[0]+1)%n

    # perm の 先頭要素をサイクル分解する
    cycle=[0]
    v=perm[0]
    while(v):
        cycle.append(v)
        v=perm[v]

    # 元に戻るまで何周したか -> まずは k をこれで割る
    cycle.append(0)
    cnt=0
    for i in range(len(cycle)-1):
        if(cycle[i+1]<cycle[i] or cycle[i]+1==cycle[i+1]):
            cnt+=1
    k%=cnt

    # k が 0 になるまで消費する
    for i in range(len(cycle)-1):
        s=(cycle[i+1]<cycle[i] or cycle[i]+1==cycle[i+1])
        if(k-s<=0):
            break
        else:
            k-=s

    # cycle[i] 以降の数列について、実際に構成すればよい
    ans=[]
    i=cycle[i]
    while(i!=0 and i!=n):
        if(i==n-1):
            ans.append(A[i])
            i+=1
        elif(perm[i]==0):
            i=n
        elif(perm[i]==i+1 or perm[i]<i):
            ans.append(A[i])
            i+=1
        else:
            i=perm[i]
    print(*ans)
resolve()