#include <bits/stdc++.h>
using namespace std;

long long A[200005];
vector<long long> sign[2];
vector<long long> stack1[2];

const long long MOD = 1e9+7;

long long modpow(long long a, long long b){
    if(b == 0){
        return 1%MOD;
    }else if(b == 1){
        return a%MOD;
    }else{
        long long temp = modpow(a, b>>1);
        if(b&1){
            return ((temp*temp%MOD)*a)%MOD;
        }else{
            return temp*temp%MOD;
        }
    }
}

int main(){
    int N, K;
    scanf("%d%d", &N, &K);

    bool zeroPossible = false;
    for(int i = 0; i < N; i ++){
        scanf("%lld", &A[i]);
        zeroPossible |= (A[i] == 0);

        if(A[i] > 0){
            sign[0].push_back(A[i]);
        }else if(A[i] < 0){
            sign[1].push_back(-A[i]);
        }
    }

    sort(sign[0].begin(), sign[0].end());
    sort(sign[1].begin(), sign[1].end());

    for(int i: sign[0]){
        stack1[0].push_back(i);
    }
    for(int i: sign[1]){
        stack1[1].push_back(i);
    }
    reverse(stack1[0].begin(), stack1[0].end());
    reverse(stack1[1].begin(), stack1[1].end());

    int indx0 = 0;
    int indx1 = stack1[1].size();
    while(stack1[1].size() > K/2*2 || (stack1[1].size()&1) == 1){
        stack1[1].pop_back();
    }

    //printf("not done yet: indx0=%d stack1[1].size()=%d\n", indx0, (int)stack1[1].size());

    long long current_product = 1;
    for(long long i: stack1[1]){
        current_product = current_product*i%MOD;
    }

    while(indx0 + stack1[1].size() < K && indx0 < (int)stack1[0].size()){
        current_product = current_product*stack1[0][indx0]%MOD;
        indx0 ++;
    }
    //printf("indx0=%d stack1[1].size()=%d\n", indx0, (int)stack1[1].size());

    if(indx0 + (int)stack1[1].size() < K){
        if(zeroPossible){
            printf("0");
            return 0;
        }

        stack1[0].clear();
        stack1[1].clear();
        for(int i: sign[0]){
            stack1[0].push_back(i);
        }
        for(int i: sign[1]){
            stack1[1].push_back(i);
        }

        int indx0 = 0;
        int indx1 = stack1[1].size();
        while(stack1[1].size() > 1+(K-1)/2*2 || stack1[1].size()%2 == 0){
            stack1[1].pop_back();
        }

        //printf("Negative: %d %d\n", indx0, (int)stack1[1].size());

        long long current_product = MOD-1;
        for(long long i: stack1[1]){
            current_product = current_product*i%MOD;
        }

        while(indx0 + stack1[1].size() < K && indx0 < (int)stack1[0].size()){
            current_product = current_product*stack1[0][indx0]%MOD;
            indx0 ++;
        }

         while(indx0 + 2 <= (int)stack1[0].size() && (int)stack1[1].size() >= 2){
            long long x1 = stack1[1].back(); stack1[1].pop_back();
            long long x2 = stack1[1].back(); stack1[1].pop_back();

            long long toDivide = x1*x2;
            long long toMultiply = stack1[0][indx0]*stack1[0][indx0+1];
            //printf("debug: %lld %lld\n", toMultiply, toDivide);
            if(toMultiply <= toDivide){
                current_product = (current_product)*(toMultiply%MOD)%MOD;
                current_product = (current_product)*(modpow(toDivide%MOD, MOD-2))%MOD;
                indx0 += 2;
            }else{
                break;
            }
        }

        printf("%lld", current_product);
        return 0;
    }

    //printf("Here");

    while(indx0 + 2 <= (int)stack1[0].size() && (int)stack1[1].size() >= 2){
        long long x1 = stack1[1].back(); stack1[1].pop_back();
        long long x2 = stack1[1].back(); stack1[1].pop_back();

        long long toDivide = x1*x2;
        long long toMultiply = stack1[0][indx0]*stack1[0][indx0+1];
        //printf("debug: %lld %lld\n", toMultiply, toDivide);
        if(toMultiply >= toDivide){
            current_product = (current_product)*(toMultiply%MOD)%MOD;
            current_product = (current_product)*(modpow(toDivide%MOD, MOD-2))%MOD;
            indx0 += 2;
        }else{
            break;
        }
    }

    printf("%lld", current_product);
    return 0;
}


Measured memory_bytes: 9468