#include <bits/stdc++.h>
using namespace std;
using ll=long long;
#define rep(i,n) for (ll i=0; i<n; ++i)
#define all(c) begin(c),end(c)
#define PI acos(-1)
#define oo LLONG_MAX
template<typename T1, typename T2>
bool chmax(T1 &a,T2 b){if(a<b){a=b;return true;}else return false;}
template<typename T1, typename T2>
bool chmin(T1 &a,T2 b){if(a>b){a=b;return true;}else return false;}
/*
絶対値のおおきいものをKこ選ぶ。
負だった場合どうするか・・・

負の中から1個減らして正から1個とる

負しかない場合とか
負にならざるを得ない場合、小さい数からとることになる
もし負だった場合、

4 2
-1 0 10 0

100
*/

ll MOD = 1e9+7;
ll modpow(ll a, ll n){
  if(n==1) return a%MOD;
  if(n%2==1) return (a*modpow(a,n-1))%MOD;
  else{
    ll t=modpow(a,n/2)%MOD;
    return (t*t)%MOD;
  }
}

int main(){
  cin.tie(0);
  ios::sync_with_stdio(0);
  
  ll N, K; cin >> N >> K;
  vector<ll> pos, neg;
  vector<pair<ll, ll>> total(N);
  rep(i, N){
    ll a; cin >> a;
    if (a < 0)
      neg.push_back(a);
    else
      pos.push_back(a);
    int flag = 1;
    if (a < 0)
      flag = -1;
    total[i] = {abs(a), flag};
//cout<<"a:"<<a<<" abs"<<abs(a)<<endl;    
  }
  sort(all(pos));
  sort(all(neg));
  sort(all(total));
  reverse(all(pos));  
  //負になるしかない場合、小さい値取りだす
  ll ans = 1, minus = 0;
  if ((N == K && (neg.size() % 2 == 1))
      || (pos.size() == 0 && (K%2 == 1))){
    rep(i, K){
      ll v1 = total[i].first;
      ll v2 = total[i].second;
      ans *= v1 * v2;
      ans %= MOD;
      ans = (ans + MOD) % MOD;
    }
    cout << ans << endl;
//cout<<"getmin"<<endl;
    return 0;
  }
  
  reverse(all(total));
  auto itr1 = pos.begin();
  auto itr2 = neg.begin();
  rep(i, K){
    ll v1 = total[i].first;
    ll v2 = total[i].second;
//cout<<"v1:"<<v1<<" v2:"<<v2<<" ans:"<<ans<<endl;
    ans *= v1 * v2;
    ans %= MOD;
    ans = (ans + MOD) % MOD;
    if (v2 == 1)
      itr1++;
    else{
      itr2++;
      minus++;
    }
  }
  // プラスになった場合
  if (minus % 2 == 0){
    cout << ans << endl;
//cout<<"notminus"<<endl;    
    return 0;
  }
  //マイナスになっちゃって。
  //プラスから除く場合
  ll p1 = 0, p2 = 0, m1 = 0, m2 = 0;
//cout<<"itr1:"<<*itr1<<" itr2:"<< *itr2<<endl;
  if (itr1 == pos.end()){//プラスを除いてマイナスとる
    itr1--;
//cout<<"aftitr1:"<<*itr1<<" itr2:"<< *itr2<<endl;
    ans *= modpow(*itr1 ,MOD-2); //tmpで割る
    ans %= MOD;
    ans = (ans + MOD) % MOD;
    ans *= *itr2;
    ans %= MOD;
    ans = (ans + MOD) % MOD;
    cout << ans << endl;
//cout << "end" << endl;
    return 0;
  }
  if (itr2 == neg.end() || itr1 == pos.begin()){
    itr2--;
    ans *= modpow(*itr2 ,MOD-2); //tmpで割る
    ans %= MOD;
    ans = (ans + MOD) % MOD;
    ans *= *itr1;
    ans %= MOD;
    ans = (ans + MOD) % MOD;
    cout << ans << endl;
//cout << "end2" << endl;
    return 0;
  }
  itr1--;
  itr2--;
  p1 = *itr1;
  m1 = *itr2;
  itr1++;
  itr2++;
  if (itr1 != pos.end())
    p2 = *itr1;
  if (itr2 != neg.end())
  m2 = *itr2;
//cout <<"p1:"<<p1 << " p2:"<<p2<<" m1:"<<m1<<" m2:"<<m2<<endl;  
  ll p = p1 * p2;
  ll m = m1 * m2;
  if (p > m){//マイナスのぞいてプラスかける
    ans *= modpow(m1, MOD-2);
    ans %= MOD;
    ans = (ans + MOD) % MOD;
    if (itr1 != pos.end())
      ans *= p2;
    else
      ans *= p1;
    ans %= MOD;
    ans = (ans + MOD) % MOD;
  }
  else{
    ans *= modpow(p1, MOD-2);
    ans %= MOD;
    ans = (ans + MOD) % MOD;
    ans *= m2;
    ans %= MOD;
    ans = (ans + MOD) % MOD;
  }
  cout << ans << endl;
  //もしp1p2が大きければm1のぞいてp2かける。
}


Measured memory_bytes: 8464