#include <bits/stdc++.h>
using namespace std;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
using ll = long long;
using P = pair<ll, ll>;
const long double PI = acos(-1.0L);
ll GCD(ll a, ll b) { return b?GCD(b, a%b):a; }
ll LCM(ll a, ll b) { return a/GCD(a, b)*b; }

// auto mod int
const int mod = 1000000007;
// const int mod = 998244353;
struct mint {
    ll x; // typedef long long ll;
    mint(ll x=0):x((x%mod+mod)%mod){}
    mint operator-() const { return mint(-x);}
    mint& operator+=(const mint a) {
      if ((x += a.x) >= mod) x -= mod;
      return *this;
    }
    mint& operator-=(const mint a) {
      if ((x += mod-a.x) >= mod) x -= mod;
      return *this;
    }
    mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this;}
    mint operator+(const mint a) const { return mint(*this) += a;}
    mint operator-(const mint a) const { return mint(*this) -= a;}
    mint operator*(const mint a) const { return mint(*this) *= a;}
    mint pow(ll t) const {
      if (!t) return 1;
      mint a = pow(t>>1);
      a *= a;
      if (t&1) a *= *this;
      return a;
    }

    // for prime mod
    mint inv() const { return pow(mod-2);}
    mint& operator/=(const mint a) { return *this *= a.inv();}
    mint operator/(const mint a) const { return mint(*this) /= a;}

    // bool operator==(const mint a) { return x == a.x; }
};
istream& operator>>(istream& is, mint& a) { return is >> a.x;}
ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}

ll n, k;
struct Data {
    ll num, anum;
    bool operator<(const Data &r) const { return r.anum < anum; };
};

int main() {
    cin >> n >> k;
    vector<Data> avec;
    int mcnt = 0;
    for(int i = 0; i < n; ++i) {
        Data indata;
        cin >> indata.num;
        indata.anum = abs(indata.num);
        if(indata.num < 0) mcnt++;
        avec.emplace_back(indata);
    }
    int pcnt = n-mcnt;
    sort(avec.begin(), avec.end());

    mint ans = 1;
    if(mcnt == n) {
        // 全て負の数
        if(k%2 == 0) {
            for(int i = 0; i < k; ++i) ans *= avec[i].num;
        }else {
            for(int i = n-1; i >= n-k; --i) ans *= avec[i].num;
        }
    }else if(pcnt == n || n == k) {
        // 全てが正の数
        for(int i = 0; i < k; ++i) ans *= avec[i].num;
    }else {
        int kmcnt = 0;
        for(int i = 0; i < k; ++i) {
            if(avec[i].num < 0) kmcnt++;
        }
        int kpcnt = k-kmcnt;
        if(kmcnt == k) {
            // 上位k個が全て負の数
            if(k%2 == 0) {
                for(int i = 0; i < k; ++i) ans *= avec[i].num;
            }else {
                for(int i = k; i < n; ++i) {
                    if(avec[i].num >= 0) {
                        swap(avec[i], avec[k-1]);
                        break;
                    }
                }
                for(int i = 0; i < k; ++i) ans *= avec[i].num;
            }
        }else if(kpcnt == k) {
            // 上位k個が全て正の数
            for(int i = 0; i < k; ++i) ans *= avec[i].num;
        }else {
            // 最初に選んだk個に正と負が混ざっている
            if(kmcnt%2 == 0) {
                // 正と負が混ざっているが、全体が正になる
                for(int i = 0; i < k; ++i) ans *= avec[i].num;
            }else {
                // 一番小さい正と負の2数を残りの正と正、負と負で塗り替えられるか
                int mno = -1, pno = -1;
                for(int i = k-1; i >= 0; --i) {
                    if(mno == -1) {
                        if(avec[i].num < 0) mno = i;
                    }
                    if(pno == -1) {
                        if(avec[i].num >= 0) pno = i;
                    }
                    if(pno != -1 && mno != -1) break;
                }

                ll pch = avec[pno].num;
                ll mch = avec[mno].num;
                for(int i = pno+1; i < n; ++i) {
                    if(avec[i].num >= 0) {
                        pch *= avec[i].num;
                        break;
                    }
                }
                for(int i = mno+1; i < n; ++i) {
                    if(avec[i].num < 0) {
                        mch *= avec[i].num;
                        break;
                    }
                }

                if(pch >= mch) {
                    for(int i = 0; i < k; ++i) {
                        if(i == mno) continue;
                        ans *= avec[i].num;
                    }
                    for(int i = k; i < n; ++i) {
                        if(avec[i].num >= 0) {
                            ans *= avec[i].num;
                            break;
                        }
                    }
                }else {
                    for(int i = 0; i < k; ++i) {
                        if(i == pno) continue;
                        ans *= avec[i].num;
                    }
                    for(int i = k; i < n; ++i) {
                        if(avec[i].num < 0) {
                            ans *= avec[i].num;
                            break;
                        }
                    }
                }
            }
        }
    }

    cout << ans << endl;
}

Measured memory_bytes: 7440