#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
using namespace __gnu_pbds; 
using namespace std;
 
#define ff              first
#define ss              second
#define int             long long
#define pb              push_back
#define mp              make_pair
#define pii             pair<int,int>
#define vi              vector<int>
#define mii             map<int,int>
#define pqb             priority_queue<int>
#define pqs             priority_queue<int,vi,greater<int> >
#define MX              200005
#define mod             1000000007
#define inf             1e18
#define ps(x,y)         fixed<<setprecision(y)<<x
#define mk(arr,n,type)  type *arr=new type[n];
#define w(x)            int x; cin>>x; while(x--)
#define pw(b,p)         pow(b,p) + 0.1
mt19937                 rng(chrono::steady_clock::now().time_since_epoch().count());
 
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
 
void codeforces()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
}
int a[200005];
bool compare(int a, int b)
{
    if( abs(a) > abs(b)) return true;
    else return !true;
}
int modinv(int a,int n = mod - 2){
  if(!n)
    return 1;
  int p = modinv(a,n/2);
  p = (p*p)%mod;
  if(n&1)
    return (p*a)%mod;
  return p;
}
int32_t main()
{
    int n, k;
    cin>>n>>k;
    int flag = 0;
    for(int i=0; i<n; i++){ 
        cin>>a[i];
        if( a[i] > 0) flag = 1;
    }
    if( k == n){
        int ans = 1;
        for(int i=0; i<k; i++){ 
            ans = ans*(a[i]%mod);
            ans = (ans)%mod;
        }
        cout<<(mod + ans)%mod;
        return 0;
    }
    if(flag == 0 and k%2 == 1){
        sort(a, a+n, greater<int>());
        int ans = 1;
        for(int i=0; i<k; i++){ 
            ans*=a[i];
            ans = (ans)%mod;
        }
        cout<<(mod + ans)%mod<<endl;
        return 0;
    }
    sort(a, a+n, compare);
    int ans = 1;
    int sign = 0;
    for(int i=0; i<k; i++){
        ans = ans*a[i];
        if( a[i] < 0) sign++;
        ans = (ans)%mod;
    }
    if( sign%2 == 0) cout<<(ans+mod)%mod;
    else{
        map<int, int> m;
        vector<int> s1,s2;
        for(int i=k; i<n; i++){
            if( a[i] < 0) s1.pb(a[i]);
            else s2.pb(a[i]);
        }
        if( s1.size() > 0) sort(s1.begin(), s1.end());
        if( s2.size() > 0) sort(s2.begin(), s2.end());
        int x = 1, y = -1;
        if( s1.size() > 0)  x = s1.front();
        if( s2.size() > 0)  y = s2.back();
        s1.clear();
        s2.clear();
        for(int i=0; i<k; i++){
             m[a[i]]++;
            if( a[i] < 0) s1.pb(a[i]);
            else s2.pb(a[i]);
        }
        if( s1.size() > 0)sort(s1.begin(), s1.end());
        if( s2.size() > 0)sort(s2.begin(), s2.end());
        int t1 = 1, t2 = -1;
        if( s1.size() > 0) t1 = s1.back();
        if( s2.size() > 0) t2 = s2.front();
        if( x == 1 or t2 == -1){
            m[t1]--;
            m[y]++;
        }
        else if( y == -1 or t1 == 1){
            m[t2]--;
            m[x]++;
        }
        else if( x*t1 > y*t2){ 
            m[t2]--;
            m[x]++;
        }
        else{
            m[t1]--;
            m[y]++;
        }
        ans = 1;
        for(auto &i: m){
            for(int j=0; j<i.ss; j++){
                ans*=i.ff;
                ans = (ans)%mod;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

Measured memory_bytes: 16356