#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define sz(x) int(x.size())
#define show(x) {for(auto i: x){cout << i << " ";} cout << endl;}
using namespace std;
using ll = long long;
using P = pair<int, int>;

const int mod = 1000000007;
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;}
};
istream& operator>>(istream& is, mint& a) { return is >> a.x;}
ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}
// combination mod prime
struct combination {
  vector<mint> fact, ifact;
  combination(int n):fact(n+1),ifact(n+1) {
    assert(n < mod);
    fact[0] = 1;
    for (int i = 1; i <= n; ++i) fact[i] = fact[i-1]*i;
    ifact[n] = fact[n].inv();
    for (int i = n; i >= 1; --i) ifact[i-1] = ifact[i]*i;
  }
  mint operator()(int n, int k) {
    if (k < 0 || k > n) return 0;
    return fact[n]*ifact[k]*ifact[n-k];
  }
  mint p(int n, int k) {
    return fact[n]*ifact[n-k];
  }
} c(10000007);

// c(5, 2) → 10, c.p(5, 2) → 20
int main() {
  // 0以上と0未満でカテゴリー分け、最大値が0以上になるかどうか、0があるかどうか
  int N, K;
  cin >> N >> K;
  vector<int> A(N);
  rep(i, N) cin >> A[i];
  sort(A.rbegin(), A.rend());
  int pos = 0, zero = 0, neg = 0; // positiveは0を含む
  rep(i, N) {
    if (A[i] > 0) ++pos;
    else if (A[i] < 0) ++neg;
    else ++zero;
  }
  mint ans = 1;
  // 最初のK個と最後のK個しか関係なさそう、でもmintが問題
  // 負の数から可能であれば偶数個とる、奇数しか取れない時は？
  if (N == K) {
    rep(i, N) ans *= A[i];
  } else if (pos == 0) {
    // 選択肢なし、最初のK個と最後のK個を比較
    if (K&1) {
      // 積はマイナスになる
      if (zero) ans = 0;
      else {
        rep(i, K) ans *= A[i];
      }
    } else {
      // 積はプラス
      for (int i = N-1; i > N-1-K; i--) {
        ans *= A[i];
      }
    }    
  } else if (neg == 0) {
    rep(i, K) ans *= A[i];
  } else if (pos + neg < K) {
    ans = 0;
  } else {
    // pos、negそれぞれ１以上→答えは正の数に出来る？
    int cur = 0;
    if (K&1) {
      // A[0]は必ず使う
      ans = A[0];
      --K;
      ++cur;
    }
    // Kは偶数
    vector<ll> p;
    vector<ll> m;
    for (int i = cur; i < N; i++) {
      if (A[i] > 0) p.push_back(A[i]);
      else if (A[i] < 0) m.push_back(A[i]);
    }
    vector<ll> cand;
    for (int i = 0; i < min(K, sz(p)); i++) {
      if (i&1) continue;
      cand.push_back(p[i] * p[i+1]);
    }
    sort(m.begin(), m.end());
    for (int i = 0; i < min(K, sz(m)); i++) {
      if (i&1) continue;
      cand.push_back(m[i] * m[i+1]);
    }
    sort(cand.rbegin(), cand.rend());
    rep(i, K/2) {
      ans *= cand[i];
    }
  }
  cout << ans << '\n';
  // cout << c.fact[2] * c.ifact[2] << '\n';
  // cout << c.fact[4] * c.ifact[3] << '\n';

  return 0;
}

Measured memory_bytes: 163600