Problem p02616 (python)

Fixed submission:
import sys
input = sys.stdin.readline

n,k= map(int, input().split())
a= list(map(int, input().split()))

mod=10**9+7
# mod の逆元
def modinv(a, mod=10**9+7):
    return pow(a, mod-2, mod)

# 正,負 で分ける
b=[]
c=[]
for i in a:
    if i>=0:
        b.append(i)
    else:
        c.append(i)

b.sort(reverse=True)
c.sort()
ans=1
if k==n:
    for i in range(n):
        ans*=a[i]
        ans%=mod

elif k%2==1 and len(c)==n:
    c.sort(reverse=True)
    for i in range(k):
        ans*=c[i]
        ans%=mod

else:
    x=k
    # プラスの配列をどこまで進めたか
    v=0
    # マイナスの配列をどこまで進めたか？
    w=0
    if k%2==1:
        ans*=b.pop(0)
        k-=1

    for i in range(k):
        if x>=2:
            x-=2
            if v+2<=len(b) and w+2<=len(c):
                if b[v]*b[v+1]>c[w]*c[w+1]:
                    ans*=b[v]*b[v+1]
                    v+=2
                else:
                    ans*=c[w]*c[w+1]
                    w+=2


            elif v+2<=len(b):
                ans*=b[v]*b[v+1]
                v+=2

            else:
                ans*=c[w]*c[w+1]
                w+=2

            ans%=mod
            if x==0:
                break

print(ans)

Buggy submission (verdict: Runtime Error):
import sys
input = sys.stdin.readline

n,k= map(int, input().split())
a= list(map(int, input().split()))

mod=10**9+7
# mod の逆元
def modinv(a, mod=10**9+7):
    return pow(a, mod-2, mod)

# 正,負 で分ける
b=[]
c=[]
for i in a:
    if i>=0:
        b.append(i)
    else:
        c.append(i)

b.sort(reverse=True)
c.sort()
ans=1
if k==n and len(c)%2==0:
    for i in range(n):
        ans*=a[i]
        ans%=mod

elif k%2==1 and len(c)==n:
    c.sort(reverse=True)
    for i in range(k):
        ans*=c[i]
        ans%=mod

else:
    x=k
    # プラスの配列をどこまで進めたか
    v=0
    # マイナスの配列をどこまで進めたか？
    w=0
    for i in range(k):
        if x>=2:
            x-=2
            if v+2<=len(b) and w+2<=len(c):
                if b[v]*b[v+1]>c[w]*c[w+1]:
                    ans*=b[v]*b[v+1]
                    v+=2
                else:
                    ans*=c[w]*c[w+1]
                    w+=2


            elif v+2<=len(b):
                ans*=b[v]*b[v+1]
                v+=2

            else:
                ans*=c[w]*c[w+1]
                w+=2
            ans%=mod
            if x==0:
                break
        else:
            ans*=b[v]
            ans%=mod
            break
print(ans)

Buggy submission (verdict: Runtime Error):
n,k= map(int, input().split())
a= list(map(int, input().split()))

mod=10**9+7

if k%2==0:
    ans = 1
    for i in range(n):
        a[i]=abs(a[i])
    a.sort(reverse=True)
    for i in range(k):
        ans*=a[i]
        ans%=mod
    print(ans)
else:
    # 正,負,0で分ける
    b=[]
    c=[]
    d=[]
    for i in a:
        if i>0:
            b.append(i)
        elif i<0:
            c.append(i)
        else:
            d.append(i)
    b.sort(reverse=True)
    c.sort()

    if len(b)>0 and k-((len(b)//2)*2+len(b)%2)<=len(c):
        # 累積積
        b1=[1,b[0]]
        c1=[1,c[0]]
        x=b[0]
        y=c[0]
        for i in range(1,len(b)):
            x*=b[i]
            b1.append(x)
        for i in range(1,len(c)):
            y*=abs(c[i])
            c1.append(y)
        ans=0
        for i in range(len(b)):
            if i%2==0 and k-i<=len(c):
                cnt=b1[i+1]*c1[k-i-1]
                ans=max(cnt,ans)
        print(ans%mod)

    elif len(b)+len(c)<k:
        print(0)
    else:
        ans=1
        c.sort(reverse=True)
        for i in range(k):
            ans*=c[i]
        print(ans%mod)