

def main():

    MOD = 10**9+7

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

    al = list(map(int, input().split()))

    al_abs = []

    al_nl = []

    for a in al: 

        if a > 0: sig = 1

        elif a < 0 : 

            sig = -1

            al_nl.append(a)

        else: sig = 0

        al_abs.append((abs(a), sig))



    if n == k:

        ans = 1

        for i in range(k):

            a = al[i]

            ans *= a

            ans %= MOD

        print(ans)

        exit()



    al_abs.sort(reverse=True)

    n_cnt = 0

    last_p = -1

    last_n = -1

    for i in range(k):

        a, sig = al_abs[i]

        if sig == -1:

            n_cnt+=1

            last_n = i

        elif sig == 1:

            last_p = i

    

    ans = 1

    if n_cnt%2 == 0:

        for i in range(k):

            a, sig = al_abs[i]

            ans *= a

            ans %= MOD

        print(ans)

        exit()





    next_p = -1

    next_n = -1 

    for i in range(k,n):

        a, sig = al_abs[i]

        if sig == 1 and next_p == -1:

            next_p = i

        elif sig == -1 and next_n == -1:

            next_n = i

        if next_n != -1 and next_p != -1:

            break



    comp_np = 0

    if next_p != -1:

        last_n_val = al_abs[last_n][0]

        next_p_val = al_abs[next_p][0]

        comp_np = next_p_val*(1.0)/last_n_val



    comp_pn = 0

    if next_n != -1 and last_p != -1:

        last_p_val = al_abs[last_p][0]

        next_n_val = al_abs[next_n][0]

        comp_pn = next_n_val*(1.0)/last_p_val



    if comp_np == 0 and comp_pn > 0:

        np_or_pn = False

    elif comp_pn == 0 and comp_np > 0:

        np_or_pn = True

    elif comp_np > 0 and comp_pn > 0:

        if next_p_val*last_p_val > next_n_val*last_n_val:

            np_or_pn = True

        else:

            np_or_pn = False



    elif comp_np == 0 and comp_pn == 0:

        if 0 in al:

            print((0))

            exit()

        else:

            al_nl.sort(reverse=True)

            for i in range(k):

                a = al_nl[i]

                ans *= (a)

                ans %= MOD

            print(ans)

            exit()





    # print(next_p, next_n, comp_np, comp_pn)



    for i in range(k):

        if np_or_pn and i == last_n:

            continue

        if (not np_or_pn) and i == last_p:

            continue

        a, sig = al_abs[i]

        ans *= a

        ans %= MOD



    if np_or_pn:

        ans *= next_p_val

        ans %= MOD

    else:

        ans *= next_n_val

        ans %= MOD



    print(ans)



if __name__ == "__main__":

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

al = list(map(int, input().split()))

al_abs = []

al_p = []

al_m = []

zero_cnt = 0

MOD = 10**9+7



if n == 1 and k == 1:

    print((al[0]%MOD))

    exit()



if n == k:

    ans = 1

    for a in al:

        ans *= a

        ans %= MOD

    print(ans)

    exit()



for a in al:

    if a == 0:

        zero_cnt+=1

    else:

        if a > 0: 

            al_abs.append((abs(a),1))

            al_p.append(a)

        elif a < 0: 

            al_abs.append((abs(a),-1))



al_abs.sort(reverse=True)

if len(al_abs) < k:

    print((0))

    exit()



if len(al_abs) == k:

    ans = 1

    m_cnt = 0

    for a,s in al_abs:

        if s == -1: m_cnt += 1

        ans *= a

        ans %= MOD

    if m_cnt%2 == 0:

        print(ans)

    else:

        print((0))

    exit()

    



if not al_p:

    if k%2 == 1 and zero_cnt > 0:

        print((0))

    else:

        if k%2 == 1:

            al_abs.sort()

        ans = 1

        for a,s in al_abs[:k]:

            ans *= (a*(-1))

            ans %= MOD

        print(ans)

    exit()







val = 1

m_cnt = 0

last_m = 0

last_p = 0

for i in range(k):

    v,sig = al_abs[i]

    val *= v

    val %= MOD

    if sig == -1:

        m_cnt += 1

        last_m = v

    else:

        last_p = v



if m_cnt %2 == 0:

    print(val)

    exit()





# minus -> plus 



## search next p

next_p = 0

for i in range(k,len(al_abs)):

    v,sig = al_abs[i]

    if sig == 1:

        next_p = v

        break



## search next m

next_m = 0

for i in range(k,len(al_abs)):

    v,sig = al_abs[i]

    if sig == -1:

        next_m = v

        break



# print(next_m, next_p)



if next_p == 0 and next_m == 0:

    print((0))

    exit()



# last_m -> next_p

if next_p*last_p >= next_m*last_m or last_p == 0:

# if next_p > 0 and next_m == 0:

    ans = 1

    skip_flag = False

    for i in range(k):

        v,sig = al_abs[i]

        if not skip_flag and v == last_m and sig == -1:

            ans *= next_p

            skip_flag = True

        else:

            ans *= v

        # print(ans)

        ans %= MOD

    print(ans)

    exit()





# last_p -> next_m

# if next_p == 0 and next_m > 0:

elif next_p*last_p <= next_m*last_m:

    ans = 1

    skip_flag = False

    for i in range(k):

        v,sig = al_abs[i]

        if not skip_flag and v == last_p and sig == 1:

            ans *= next_m

            skip_flag = True

        else:

            ans *= v

        ans %= MOD

    print(ans)

    exit()
def main():
    MOD = 10**9 + 7
    n, k = list(map(int, input().split()))
    al = list(map(int, input().split()))
    al_abs = []
    al_nl = []
    for a in al:
        if a > 0:
            sig = 1
        elif a < 0:
            sig = -1
            al_nl.append(a)
        else:
            sig = 0
        al_abs.append((abs(a), sig))
    if n == k:
        ans = 1
        for i in range(k):
            a = al[i]
            ans *= a
            ans %= MOD
        print(ans)
        exit()
    al_abs.sort(reverse=True)
    n_cnt = 0
    last_p = -1
    last_n = -1
    for i in range(k):
        a, sig = al_abs[i]
        if sig == -1:
            n_cnt += 1
            last_n = i
        elif sig == 1:
            last_p = i
    ans = 1
    if n_cnt % 2 == 0:
        for i in range(k):
            a, sig = al_abs[i]
            ans *= a
            ans %= MOD
        print(ans)
        exit()
    next_p = -1
    next_n = -1
    for i in range(k, n):
        a, sig = al_abs[i]
        if sig == 1 and next_p == -1:
            next_p = i
        elif sig == -1 and next_n == -1:
            next_n = i
        if next_n != -1 and next_p != -1:
            break
    comp_np = 0
    if next_p != -1:
        last_n_val = al_abs[last_n][0]
        next_p_val = al_abs[next_p][0]
        comp_np = next_p_val * (1.0) / last_n_val
    comp_pn = 0
    if next_n != -1 and last_p != -1:
        last_p_val = al_abs[last_p][0]
        next_n_val = al_abs[next_n][0]
        comp_pn = next_n_val * (1.0) / last_p_val
    if comp_np == 0 and comp_pn > 0:
        np_or_pn = False
    elif comp_pn == 0 and comp_np > 0:
        np_or_pn = True
    elif comp_np > 0 and comp_pn > 0:
        if next_p_val * last_p_val > next_n_val * last_n_val:
            np_or_pn = True
        else:
            np_or_pn = False
    elif comp_np == 0 and comp_pn == 0:
        if 0 in al:
            print((0))
            exit()
        else:
            al_nl.sort(reverse=True)
            for i in range(k):
                a = al_nl[i]
                ans *= a
                ans %= MOD
            print(ans)
            exit()
    # print(next_p, next_n, comp_np, comp_pn)
    for i in range(k):
        if np_or_pn and i == last_n:
            continue
        if (not np_or_pn) and i == last_p:
            continue
        a, sig = al_abs[i]
        ans *= a
        ans %= MOD
    if np_or_pn:
        ans *= next_p_val
        ans %= MOD
    else:
        ans *= next_n_val
        ans %= MOD
    print(ans)


if __name__ == "__main__":
    main()

n, k = list(map(int, input().split()))
al = list(map(int, input().split()))
al_abs = []
al_p = []
al_m = []
zero_cnt = 0
MOD = 10**9 + 7
if n == 1 and k == 1:
    print((al[0] % MOD))
    exit()
if n == k:
    ans = 1
    for a in al:
        ans *= a
        ans %= MOD
    print(ans)
    exit()
for a in al:
    if a == 0:
        zero_cnt += 1
    else:
        if a > 0:
            al_abs.append((abs(a), 1))
            al_p.append(a)
        elif a < 0:
            al_abs.append((abs(a), -1))
al_abs.sort(reverse=True)
if len(al_abs) < k:
    print((0))
    exit()
if len(al_abs) == k:
    ans = 1
    m_cnt = 0
    for a, s in al_abs:
        if s == -1:
            m_cnt += 1
        ans *= a
        ans %= MOD
    if m_cnt % 2 == 0:
        print(ans)
    else:
        print((0))
    exit()
if not al_p:
    if k % 2 == 1 and zero_cnt > 0:
        print((0))
    else:
        if k % 2 == 1:
            al_abs.sort()
        ans = 1
        for a, s in al_abs[:k]:
            ans *= a * (-1)
            ans %= MOD
        print(ans)
    exit()
val = 1
m_cnt = 0
last_m = 0
last_p = 0
for i in range(k):
    v, sig = al_abs[i]
    val *= v
    val %= MOD
    if sig == -1:
        m_cnt += 1
        last_m = v
    else:
        last_p = v
if m_cnt % 2 == 0:
    print(val)
    exit()
# minus -> plus
## search next p
next_p = 0
for i in range(k, len(al_abs)):
    v, sig = al_abs[i]
    if sig == 1:
        next_p = v
        break
## search next m
next_m = 0
for i in range(k, len(al_abs)):
    v, sig = al_abs[i]
    if sig == -1:
        next_m = v
        break
# print(next_m, next_p)
if next_p == 0 and next_m == 0:
    print((0))
    exit()
# last_m -> next_p
if next_p * last_p >= next_m * last_m or last_p == 0:
    # if next_p > 0 and next_m == 0:
    ans = 1
    skip_flag = False
    for i in range(k):
        v, sig = al_abs[i]
        if not skip_flag and v == last_m and sig == -1:
            ans *= next_p
            skip_flag = True
        else:
            ans *= v
        # print(ans)
        ans %= MOD
    print(ans)
    exit()
# last_p -> next_m
# if next_p == 0 and next_m > 0:
elif next_p * last_p <= next_m * last_m:
    ans = 1
    skip_flag = False
    for i in range(k):
        v, sig = al_abs[i]
        if not skip_flag and v == last_p and sig == 1:
            ans *= next_m
            skip_flag = True
        else:
            ans *= v
        ans %= MOD
    print(ans)
    exit()

-def main(): -    MOD = 10**9 + 7 -    n, k = list(map(int, input().split())) -    al = list(map(int, input().split())) -    al_abs = [] -    al_nl = [] +n, k = list(map(int, input().split())) +al = list(map(int, input().split())) +al_abs = [] +al_p = [] +al_m = [] +zero_cnt = 0 +MOD = 10**9 + 7 +if n == 1 and k == 1: +    print((al[0] % MOD)) +    exit() +if n == k: +    ans = 1 +        ans *= a +        ans %= MOD +    print(ans) +    exit() +for a in al: +    if a == 0: +        zero_cnt += 1 +    else: -            sig = 1 +            al_abs.append((abs(a), 1)) +            al_p.append(a) -            sig = -1 -            al_nl.append(a) -        else: -            sig = 0 -        al_abs.append((abs(a), sig)) -    if n == k: +            al_abs.append((abs(a), -1)) +al_abs.sort(reverse=True) +if len(al_abs) < k: +    print((0)) +    exit() +if len(al_abs) == k: +    ans = 1 +    m_cnt = 0 +    for a, s in al_abs: +        if s == -1: +            m_cnt += 1 +        ans *= a +        ans %= MOD +    if m_cnt % 2 == 0: +        print(ans) +    else: +        print((0)) +    exit() +if not al_p: +    if k % 2 == 1 and zero_cnt > 0: +        print((0)) +    else: +        if k % 2 == 1: +            al_abs.sort() -        for i in range(k): -            a = al[i] -            ans *= a +        for a, s in al_abs[:k]: +            ans *= a * (-1) -        exit() -    al_abs.sort(reverse=True) -    n_cnt = 0 -    last_p = -1 -    last_n = -1 +    exit() +val = 1 +m_cnt = 0 +last_m = 0 +last_p = 0 +for i in range(k): +    v, sig = al_abs[i] +    val *= v +    val %= MOD +    if sig == -1: +        m_cnt += 1 +        last_m = v +    else: +        last_p = v +if m_cnt % 2 == 0: +    print(val) +    exit() +# minus -> plus +## search next p +next_p = 0 +for i in range(k, len(al_abs)): +    v, sig = al_abs[i] +    if sig == 1: +        next_p = v +        break +## search next m +next_m = 0 +for i in range(k, len(al_abs)): +    v, sig = al_abs[i] +    if sig == -1: +        next_m = v +        break +# print(next_m, next_p) +if next_p == 0 and next_m == 0: +    print((0)) +    exit() +# last_m -> next_p +if next_p * last_p >= next_m * last_m or last_p == 0: +    # if next_p > 0 and next_m == 0: +    ans = 1 +    skip_flag = False -        a, sig = al_abs[i] -        if sig == -1: -            n_cnt += 1 -            last_n = i -        elif sig == 1: -            last_p = i -    ans = 1 -    if n_cnt % 2 == 0: -        for i in range(k): -            a, sig = al_abs[i] -            ans *= a -            ans %= MOD -        print(ans) -        exit() -    next_p = -1 -    next_n = -1 -    for i in range(k, n): -        a, sig = al_abs[i] -        if sig == 1 and next_p == -1: -            next_p = i -        elif sig == -1 and next_n == -1: -            next_n = i -        if next_n != -1 and next_p != -1: -            break -    comp_np = 0 -    if next_p != -1: -        last_n_val = al_abs[last_n][0] -        next_p_val = al_abs[next_p][0] -        comp_np = next_p_val * (1.0) / last_n_val -    comp_pn = 0 -    if next_n != -1 and last_p != -1: -        last_p_val = al_abs[last_p][0] -        next_n_val = al_abs[next_n][0] -        comp_pn = next_n_val * (1.0) / last_p_val -    if comp_np == 0 and comp_pn > 0: -        np_or_pn = False -    elif comp_pn == 0 and comp_np > 0: -        np_or_pn = True -    elif comp_np > 0 and comp_pn > 0: -        if next_p_val * last_p_val > next_n_val * last_n_val: -            np_or_pn = True +        v, sig = al_abs[i] +        if not skip_flag and v == last_m and sig == -1: +            ans *= next_p +            skip_flag = True -            np_or_pn = False -    elif comp_np == 0 and comp_pn == 0: -        if 0 in al: -            print((0)) -            exit() -        else: -            al_nl.sort(reverse=True) -            for i in range(k): -                a = al_nl[i] -                ans *= a -                ans %= MOD -            print(ans) -            exit() -    # print(next_p, next_n, comp_np, comp_pn) -    for i in range(k): -        if np_or_pn and i == last_n: -            continue -        if (not np_or_pn) and i == last_p: -            continue -        a, sig = al_abs[i] -        ans *= a -        ans %= MOD -    if np_or_pn: -        ans *= next_p_val -        ans %= MOD -    else: -        ans *= next_n_val +            ans *= v +        # print(ans) - - -if __name__ == "__main__": -    main() +    exit() +# last_p -> next_m +# if next_p == 0 and next_m > 0: +elif next_p * last_p <= next_m * last_m: +    ans = 1 +    skip_flag = False +    for i in range(k): +        v, sig = al_abs[i] +        if not skip_flag and v == last_p and sig == 1: +            ans *= next_m +            skip_flag = True +        else: +            ans *= v +        ans %= MOD +    print(ans) +    exit()