Problem p02616 (python)

Fixed submission:
n, k = map(int, input().split())
a_list = list(map(int, input().split()))
mod = 10**9+7
a_list.sort()
ans = 1
if k % 2 == 1 and a_list[-1] < 0:
    for i in range(k):
        ans *= a_list[n - 1 - i]
        ans %= mod
else:
    l = 0
    r = -1
    mlt1 = a_list[0] * a_list[1]
    mlt2 = a_list[-2] * a_list[-1]
    count = 0
    while True:
        if count == k:
            break
        elif count == k - 1:
            ans *= a_list[r] % mod
            ans %= mod
            break
        if mlt1 >= mlt2:
            ans *= mlt1 % mod
            l += 2
            count += 2
            if l <= n - 2:
                mlt1 = a_list[l + 1] * a_list[l]
        else:
            ans *= a_list[r] % mod
            r -= 1
            count += 1
            if r >= - n + 1:
                mlt2 = a_list[r - 1] * a_list[r]
        ans %= mod
print(ans)

Buggy submission (verdict: Runtime Error):
mod=10**9+7
n,k=map(int,input().split())
arr=list(map(int,input().split()))
cnt_plus=0
cnt_zero=0
cnt_minus=0
arr_plus=[]
arr_minus=[]
for i in range(n):
  if arr[i]>0:
    cnt_plus+=1
    arr_plus.append(arr[i])
  elif arr[i]<0:
    cnt_minus+=1
    arr_minus.append(-arr[i])
  else:
    cnt_zero+=1
if cnt_plus+cnt_minus<k: #K個の積の中に0を含む場合、答えは0
  print(0)
  exit()
if k==n: #K=Nの場合
  if cnt_zero!=0: #0がひとつでもあれば答えは0
    print(0)
  else:
    ans=1
    for i in range(cnt_plus):
      ans*=arr_plus[i]
      ans%=mod
    for i in range(cnt_minus):
      ans*=arr_minus[i]
      ans%=mod
    if cnt_minus%2==0: #負の数が偶数個であれば積は正
      print(ans)
    else: #そうでなければ積は負となる
      print((-ans)%mod)
  exit()
if cnt_plus==0 and k%2==1: #正の数がないとき
  if cnt_zero!=0: #0がひとつでもあれば答えは0にできる
    print(0)
  else: #0がないときは負の数を絶対値が小さい順に掛けるのが最善
    arr_minus=sorted(arr_minus)
    tmp=1
    for i in range(k):
      tmp*=arr_minus[i]
      tmp%=mod
    print((-tmp)%mod)
  exit()
else: #正の数と負の数から合計K個取れるとき
  arr_plus=sorted(arr_plus,reverse=True)
  arr_minus=sorted(arr_minus,reverse=True)
  if k%2==0: #Kが偶数であれば何もしない
    ans=1
    pos_plus=0
    pos_minus=0
    cnt=0
  else: #Kが奇数であれば正の数から最大のものを取っておき、Kが偶数の場合に帰着させる
    ans=arr_plus[0]
    pos_plus=1
    pos_minus=0
    cnt=1
  while cnt<k:
    cand1=0
    if pos_plus<=cnt_plus-2: #正の数を2つ取れるなら取る
      cand1=arr_plus[pos_plus]*arr_plus[pos_plus+1]      
    cand2=0
    if pos_minus<=cnt_minus-2 #負の数を2つ取れるなら取る:
      cand2=arr_minus[pos_minus]*arr_minus[pos_minus+1]
    if cand1>=cand2: #正の数を2つ取った積のほうが大きい場合
      pos_plus+=2
      ans*=cand1
      ans%=mod
    else: #負の数を2つ取った積のほうが大きい場合
      pos_minus+=2
      ans*=cand2
      ans%=mod
    cnt+=2
  print(ans)
  exit()

Buggy submission (verdict: Runtime Error):
mod=10**9+7
n,k=map(int,input().split())
a=list(map(int,input().split()))

a=sorted(a,reverse=True,key=lambda x:abs(x))

if k==n:
  ans=1
  for i in range(n):
    ans *= a[i]
    ans %= mod
  print(ans)
else:
  if k%2 and a[0]<0:
    ans=1
    for i in range(k):
      ans *=a[n-i+1]
      ans %= mod
    print(ans)
  else:
    ans=1
    count=0
    for i in range(k):
      if a[i]<0:
        count +=1
      ans *= a[i]
      ans %= mod
    if count%2==0:
      print(ans)
    else:
      min_plus=-1 #Kこの中の絶対値最小の非負数
      min_minus=1 #Kこの中の絶対値最大の負数
      for i in range(k):
        if a[i]<0:
          min_minus=a[i]
        else:
          min_plus=a[i]
      max_plus=-1 #N-Kこの中の絶対し最小の非負数
      max_minus=1 #N-Kこの中の絶対値最大の負数
      for i in range(k,n):
        if a[i]<0:
          max_minus=a[i]
          break
      for i in range(k,n):
        if a[i]>=0:
          max_plus=a[i]
          break
      if min_plus=-1: #Kこの中に非負数が存在しない
        a.remove(min_minus)
        ans=1
        for i in range(k-1):
          ans *= a[i]
          ans %= mod
        ans*=max_plus
        print(ans)
      elif min_minus=1: #Kこの中に負数が存在しない
        a.remove(min_plus)
        ans=1
        for i in range(k-1):
          ans *= a[i]
          ans %= mod
        ans*=max_minus
        print(ans) 
      elif min_plus*max_plus>=min_minus*max_minus: #Kこの中に非負数が存在しない
        a.remove(min_plus)
        ans=1
        for i in range(k-1):
          ans *= a[i]
          ans %= mod
        ans*=max_minus
        print(ans) 
      else:
        a.remove(min_minus)
        ans=1
        for i in range(k-1):
          ans *= a[i]
          ans %= mod
        ans*=max_plus
        print(ans)