/* src: (35 lines)

N, K = inputInt(), inputInt()
P = vector!(int)()
M = vector!(int)()
for i in range(N):
    if 0 < (a@inputInt()):
        P.emplace_back(a)
    else:
        M.emplace_back(a)
P.sort()
M.rsort()
ret = 1
if P.empty() and K % 2 == 1:
    ret *= M[:K] mod 1e9 + 7
elif N==K:
    ret *= M[:] mod 1e9 + 7
    ret *= P[:] mod 1e9 + 7
else:
    if K % 2 == 1:
        ret = P.pop() mod 1e9 + 7
        --K
    while K:
        if M.size() < 2:
            ret *= P.pop() mod 1e9 + 7
            ret *= P.pop() mod 1e9 + 7
        elif P.size() < 2:
            ret *= -M.pop() mod 1e9 + 7
            ret *= -M.pop() mod 1e9 + 7
        elif int64(M[M.size() - 1]) * M[M.size() - 2] < int64(P[P.size() - 1]) * P[P.size() - 2]:
            ret *= P.pop() mod 1e9 + 7
            ret *= P.pop() mod 1e9 + 7
        else:
            ret *= -M.pop() mod 1e9 + 7
            ret *= -M.pop() mod 1e9 + 7
        K -= 2
print(ret)

*/

//#define NDEBUG

#include <cassert>
#include <vector>
#include <deque>
#include <string>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;

const char*inputCLineOrWord(int mode){static char buf[2097152];static int bufLen=sizeof(buf);static int bufPos=sizeof(buf);static bool canReadFlag=true;static bool crFlag=false;static bool enterFlag=false;if(canReadFlag&&(enterFlag?bufLen<=bufPos:(int)sizeof(buf)<=bufPos+bufPos)){if(0<bufLen-bufPos){memmove(buf,buf+bufPos,bufLen-bufPos);bufLen-=bufPos;}else{bufLen=0;}char*result=fgets(buf+bufLen,sizeof(buf)-bufLen,stdin);canReadFlag=(result!=NULL);if(result!=NULL){int n=strlen(result);enterFlag=(n!=(int)sizeof(buf)-1-bufLen||(1<=bufLen+n&&buf[bufLen+n-1]=='\n'));bufLen+=n;}bufPos=0;}if(mode==0){int pos=bufPos;while(true){char c=buf[pos];if(c==32){buf[pos++]='\0';break;}else if(c==10){if(crFlag){crFlag=false;if(bufPos==pos){pos=++bufPos;continue;}}buf[pos++]='\0';break;}else if(c==13){crFlag=true;buf[pos++]='\0';break;}else if(c==0){break;}++pos;}const char*ret=buf+bufPos;bufPos=pos;while(true){char c=buf[bufPos];if(c==32||c==10||c==13){++bufPos;}else{break;}}return ret;}else if(mode==1){int pos=bufPos;while(true){char c=buf[pos];if(c==10){if(crFlag){crFlag=false;if(bufPos==pos){pos=++bufPos;continue;}}buf[pos++]='\0';break;}else if(c==13){crFlag=true;buf[pos++]='\0';break;}else if(c==0){break;}++pos;}const char*ret=buf+bufPos;bufPos=pos;if(crFlag){while(true){char c=buf[bufPos];if(c==13){++bufPos;crFlag=false;break;}else{break;}}}return ret;}else if(mode==2){return bufLen<=bufPos?NULL:buf+bufPos;}assert(false);return NULL;}const char*inputCWord(){return inputCLineOrWord(0);}int inputInt(){return atoi(inputCWord());}inline int mod_mul(int x,int y,int p){__asm__ __volatile__("imul %%edx; idiv %2":"+a"(y),"+d"(x):"r"(p));if(x<0){x+=p;}return x;}inline int mod(int x,int p){if(p<=x){do{x-=p;}while(p<=x);}else if(x<0){do{x+=p;}while(x<0);}return x;}void print_unit(bool val){printf("%s",val?"true":"false");}void print_unit(char val){printf("%c",val);}void print_unit(int val){printf("%d",val);}void print_unit(unsigned int val){printf("%u",val);}void print_unit(size_t val){printf("%zd",val);}void print_unit(const void*val){printf("%p",val);}void print_unit(long long val){printf("%lld",val);}void print_unit(__int128 val){char buf[128];int idx=128;buf[--idx]='\0';bool sign=false;if(val<0){sign=true;val=-val;}while(val){buf[--idx]='0'+(val % 10);val /=10;}if(sign){buf[--idx]='-';}printf("%s",buf+idx);}void print_unit(double val){printf("%g",val);}void print_unit(const char*val){printf("%s",val);}void print_unit(const std::string&val){printf("%s",val.c_str());}template<class T>void print_unit(const std::vector<T>&val){printf("vec(%d) {",(int)val.size());for(int i=0;i<(int)val.size();++i){fputc(' ',stdout);print_unit(val[i]);}printf(" }");}
#define _print0()
#define _print1(e)print_unit(e)
#define _print2(e1,e2)_print1(e1),fputc(' ',stdout),_print1(e2)
#define _print3(e1,e2,e3)_print2(e1,e2),fputc(' ',stdout),_print1(e3)
#define _print4(e1,e2,e3,e4)_print2(e1,e2),fputc(' ',stdout),_print2(e3,e4)
#define _print5(e1,e2,e3,e4,e5)_print3(e1,e2,e3),fputc(' ',stdout),_print2(e4,e5)
#define _print6(e1,e2,e3,e4,e5,e6)_print3(e1,e2,e3),fputc(' ',stdout),_print3(e4,e5,e6)
#define _print7(e1,e2,e3,e4,e5,e6,e7)_print4(e1,e2,e3,e4),fputc(' ',stdout),_print3(e5,e6,e7)
#define _print8(e1,e2,e3,e4,e5,e6,e7,e8)_print4(e1,e2,e3,e4),fputc(' ',stdout),_print4(e5,e6,e7,e8)
#define _print9(e1,e2,e3,e4,e5,e6,e7,e8,e9)_print5(e1,e2,e3,e4,e5),fputc(' ',stdout),_print4(e6,e7,e8,e9)
#define _print10(e1,e2,e3,e4,e5,e6,e7,e8,e9,e10)_print5(e1,e2,e3,e4,e5),fputc(' ',stdout),_print5(e6,e7,e8,e9,e10)
#define _GET_PRINT_MACRO_NAME(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NAME,...)NAME
#define print(...)_GET_PRINT_MACRO_NAME(__VA_ARGS__,_print10,_print9,_print8,_print7,_print6,_print5,_print4,_print3,_print2,_print1,_print0)(__VA_ARGS__),fputc('\n',stdout)
#define print0(...)_GET_PRINT_MACRO_NAME(__VA_ARGS__,_print10,_print9,_print8,_print7,_print6,_print5,_print4,_print3,_print2,_print1,_print0)(__VA_ARGS__)

// generated code (by mmlang) :

int N;
int K;
vector<int> P;
vector<int> M;
int ret;

int main() {
    {
        const auto & $c1 = inputInt();
        const auto & $c2 = inputInt();
        tie(N, K) = tuple<int, int>($c1, $c2);
    }
    P = vector<int>();
    M = vector<int>();
    for(int i=0, $e=N; i<$e; ++i) {
        {
            const auto & a = inputInt();
            if(0 < (a)) {
                P.emplace_back(a);
            }
            else {
                M.emplace_back(a);
            }
        }
    }
    sort(P.begin(), P.end());
    sort(M.rbegin(), M.rend());
    ret = 1;
    if(P.empty() && K % 2 == 1) {
        for(int $1=0, $e=(0<=K ? K : (int)M.size()+K); $1<$e; ++$1) ret = mod_mul(ret, M[$1], 1e9 + 7);
    }
    else if(N == K) {
        for(int $1=0, $e=(int)M.size(); $1<$e; ++$1) ret = mod_mul(ret, M[$1], 1e9 + 7);
        for(int $1=0, $e=(int)P.size(); $1<$e; ++$1) ret = mod_mul(ret, P[$1], 1e9 + 7);
    }
    else {
        if(K % 2 == 1) {
            ret = mod(({ auto ret = P.back(); P.pop_back(); ret; }), 1e9 + 7);
            --K;
        }
        while(K) {
            if(M.size() < 2) {
                ret = mod_mul(ret, ({ auto ret = P.back(); P.pop_back(); ret; }), 1e9 + 7);
                ret = mod_mul(ret, ({ auto ret = P.back(); P.pop_back(); ret; }), 1e9 + 7);
            }
            else if(P.size() < 2) {
                ret = mod_mul(ret, -({ auto ret = M.back(); M.pop_back(); ret; }), 1e9 + 7);
                ret = mod_mul(ret, -({ auto ret = M.back(); M.pop_back(); ret; }), 1e9 + 7);
            }
            else if((long long)(M[M.size() - 1]) * M[M.size() - 2] < (long long)(P[P.size() - 1]) * P[P.size() - 2]) {
                ret = mod_mul(ret, ({ auto ret = P.back(); P.pop_back(); ret; }), 1e9 + 7);
                ret = mod_mul(ret, ({ auto ret = P.back(); P.pop_back(); ret; }), 1e9 + 7);
            }
            else {
                ret = mod_mul(ret, -({ auto ret = M.back(); M.pop_back(); ret; }), 1e9 + 7);
                ret = mod_mul(ret, -({ auto ret = M.back(); M.pop_back(); ret; }), 1e9 + 7);
            }
            K -= 2;
        }
    }
    print(ret);
    return 0;
}


Measured memory_bytes: 5772