#include <bits/stdc++.h>
using namespace std;
#define TRACE(x) x
#define WATCH(x) TRACE( cout << #x" = " << x << endl)
#define PRINT(x) TRACE(printf(x))
#define WATCHR(a, b) TRACE( for(auto c = a; c != b;) cout << *(c++) << " "; cout << endl)
#define WATCHC(V) TRACE({cout << #V" = "; WATCHR(V.begin(), V.end()); } )
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) (int)(x).size()
#define mp make_pair
#define st first
#define nd second

using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using ld = long double;
using pll = pair<ll, ll>;
using vll = vector<ll>;
using pll = pair<ll, ll>;

void buff() { ios::sync_with_stdio( false ); cin.tie( nullptr ); }

constexpr ll MOD = 1e9 + 7;

inline ll pow_mod( ll a, ll b, ll mod = MOD) {
    ll res = 1; a %= mod; assert(b >= 0);
    for(;b;b>>=1) {
        if(b&1) res = (res * a) % mod;
        a = (a * a) % mod;
    }
    return res;
}
// End of template code!
int main() 
{
    buff();
    int n, k;
    cin >> n >> k;
    vector<long long> neg, pos;
    vector<long long> tudo_junto;
    
    rep(i, 0, n) {
        long long v;
        cin >> v;
        tudo_junto.emplace_back(v);
        if(v >= 0) pos.push_back(v);
        else neg.push_back(v);
    }
    
    int positive = sz(pos), negative = sz(neg);
    
    sort(neg.begin(), neg.end());
    sort(pos.rbegin(), pos.rend());

    sort(all(tudo_junto), [&] (long long& a, long long& b) { return llabs(a) < llabs(b); } );
    
    int qnt_negative = -1;
    // os elementos negativos entre [0, cur_min_id] estao atualmente selecionados
    
    // vamos pegar uma quantidade par de caras negativos [n_1, n_2, n_3, n_4, ..., n_2m-1, n_2m] 
    for(int x = 0; x <= k; x += 2) {
        if(x > negative) break; 
        int complemento = (k - x);
        if( complemento <= positive ) {
            qnt_negative = x;
            break;
        }
    }
    
    if(qnt_negative == -1) 
    {
        // melhor coisa que da pra fazer eh pegar os K com menor modulo
        long long res = tudo_junto[0];
        if(res < 0) res = (res + MOD) % MOD;
        for(int i = 1; i < k; ++i)
        {
            long long mul = tudo_junto[i];
            if(mul < 0) mul = (mul + MOD) % MOD;
            res = (res * mul) % MOD;
        }
        cout << res << '\n';
    }
    else
    {
        int cur_neg = qnt_negative;
        while(cur_neg + 2 <= negative && (cur_neg + 2) <= k)
        {
            // vamos colocar mais dois positivos
            // vou basicamente remover positivos
            long long cur_pos = (k - cur_neg);
            long long rem = (pos[cur_pos - 1] * pos[cur_pos - 2]);
            long long add = (neg[cur_neg] * neg[cur_neg + 1]); 
            if(rem > add) break;
            cur_neg = cur_neg + 2;
        }
        
        long long res = 1ll;
        
        for(int i = 0; i < cur_neg; ++i)
        {
            long long fat = (neg[i] + MOD) % MOD;
            res = (res * fat) % MOD;
        }

        int cur_pos = (k - cur_neg);

        for(int i = 0; i < cur_pos; ++i)
        {
            res = (res * pos[i]) % MOD;
        }

        cout << res << '\n';

    }
    return 0;
}



Measured memory_bytes: 7556