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

#define INF (i64)1e18
#define MOD (i64)(1e9+7)
#define REP(i, n) for(i64 i = 0; i < n; i++)
#define RANGE(i, a, b) for(i64 i = a; i < b; i++)
#define EACH(v, e, p) for_each(v.begin(), v.end(), [](auto& e) p)
#define MIN(a, b) (a < b) ? a : b
#define MAX(a, b) (a < b) ? b : a

struct ModInt {
  i64 val;
  ModInt() {
    val = 0;
  }
  ModInt(i64 a) {
    val = mod(a);
  }
  inline i64 get() {
    return val;
  }
  inline operator i64(void) {
    return get();
  }
  inline i64 mod(i64 a) {
    a %= MOD;
    if (a < 0) a += MOD;
    return a;
  }
  inline ModInt &operator+=(ModInt a) {
    val = mod(val + a.val);
    return *this;
  }
  inline ModInt &operator-=(ModInt a) {
    val = mod(val - a.val);
    return *this;
  }
  inline ModInt &operator*=(ModInt a) {
    val = mod(val * a.val);
    return *this;
  }
  inline ModInt &operator/=(ModInt a) {
    return *this *= a.inv();
  }
  inline ModInt operator+(ModInt a) {
    return ModInt(*this) += a;
  }
  inline ModInt operator-(ModInt a) {
    return ModInt(*this) -= a;
  }
  inline ModInt operator*(ModInt a) {
    return ModInt(*this) *= a;
  }
  inline ModInt operator/(ModInt a) {
    return ModInt(*this) /= a;
  }
  inline ModInt operator-(void) {
    return ModInt(0 - val);
  }
  inline bool operator==(ModInt a) {
    return val == a.val;
  }
  inline bool operator!=(ModInt a) {
    return val != a.val;
  }
  inline ModInt &operator+=(i64 a) {
    return *this += ModInt(a);
  }
  inline ModInt &operator-=(i64 a) {
    return *this -= ModInt(a);
  }
  inline ModInt &operator*=(i64 a) {
    return *this *= ModInt(a);
  }
  inline ModInt &operator/=(i64 a) {
    return *this /= ModInt(a);
  }
  inline ModInt operator+(i64 a) {
    return ModInt(*this) += a;
  }
  inline ModInt operator-(i64 a) {
    return ModInt(*this) -= a;
  }
  inline ModInt operator*(i64 a) {
    return ModInt(*this) *= a;
  }
  inline ModInt operator/(i64 a) {
    return ModInt(*this) /= a;
  }
  inline bool operator==(i64 a) {
    return val == mod(a);
  }
  inline bool operator!=(i64 a) {
    return val != mod(a);
  }
  inline ModInt pow(i64 n) {
    ModInt a(*this);
    ModInt res = 1;
    while (n) {
      if (n & 1) {
        res *= a;
      }
      n >>= 1;
      a *= a;
    }
    return res;
  }
  inline ModInt inv() {
    return pow(MOD - 2);
  }
};

int main() {
  int n, k;
  cin >> n >> k;
  vector<i64> a(n);
  int neg_cnt = 0;
  for (auto& x : a) {
    cin >> x;
    if (x < 0) neg_cnt++;
  }

  if (neg_cnt == n && k & 1) {
    sort(a.begin(), a.end(), greater<i64>());
    ModInt ans = 1;
    REP(i, k) {
      ans *= a[i];
    }
    cout << ans << endl;
    return 0;
  }

  sort(a.begin(), a.end(), [](i64 x, i64 y) { return abs(x) > abs(y); });

  ModInt ans = 1;
  int neg_cnt2 = 0;
  REP(i, k) {
    ans *= a[i];
    if (a[i] < 0) neg_cnt2++;
  }
  if (n == k || !(neg_cnt2 & 1)) {
    cout << ans.val << endl;
    return 0;
  }

  i64 pos_min = INF, neg_min = -INF, pos_max = -INF, neg_max = INF;
  RANGE(i, 0, k) {
    if (a[i] >= 0) pos_min = MIN(pos_min, a[i]);
    if (a[i] < 0) neg_min = MAX(neg_min, a[i]);
  }
  RANGE(i, k, n) {
    if (a[i] >= 0) pos_max = MAX(pos_max, a[i]);
    if (a[i] < 0) neg_max = MIN(neg_max, a[i]);
  }

  if (pos_min == INF || neg_max == INF) {
    ans /= neg_min;
    ans *= pos_max;
  } else if (neg_min == -INF || pos_max == -INF) {
    ans /= pos_min;
    ans *= neg_max;
  } else {
    if (pos_min * pos_max > neg_min * neg_max) {
      ans /= neg_min;
      ans *= pos_max;
    } else {
      ans /= pos_min;
      ans *= neg_max;
    }
  }
  cout << ans.val << endl;

  return 0;
}


Measured memory_bytes: 4812