//Leonidas
#pragma GCC optimize("Ofast")
//#pragma GCC target ("avx2")
//#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
//#include <ext/pb_ds/assoc_container'.',hpp>
//#include <ext/pb_ds/tree_policy'.',hpp>
//typedef tree < int , null_type, less <int>, rb_tree_tag, tree_order_statistics_node_update> TREE;
#define ll long long
#define ull unsigned long long int
#define pb push_back
#define mp make_pair
#define vi vector<int>
#define pii pair<int,int>
#define pss pair<short,short>
#define pld pair<long double,long double >
#define ld long double
#define piii  pair<pii,int>
#define vii vector<pair<int,int> >
#define st first
#define nd second
#define pll pair<ll,ll>
#define speed ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define M_PI 3.14159265358979323846
#define int long long
const int mod=1e9+7;
//const int mod=1009;
//const int mod=998244353;
const int inf=1000000009;
const long long INF=1000000000000000009;
const long long big=1000000000000000;
const long double eps=0.000000000000000000001;
using namespace std;
vi D,U;
int32_t main()
{
    speed
    int n,k;
    cin>>n>>k;
    for(int i=1; i<=n; i++)
    {
        int a;
        cin>>a;
        if(a<0)
            U.pb(-a);
        else
            D.pb(a);
    }
    sort(D.begin(),D.end());
    sort(U.begin(),U.end());
    n=D.size();
    int m=U.size();
    ll wynik=1;
    if(n==0&&(k&1))
    {
        for(int i=0; i<k; i++)
        {
            wynik*=U[i];
            wynik%=mod;
        }
        wynik=(mod-wynik)%mod;
        cout<<wynik;
        return 0;
    }
    else if(n+m==k)
    {
        for(int i=0;i<m;i++)
        {
            wynik*=U[i];
            wynik%=mod;
        }
        for(int i=0;i<n;i++)
        {
            wynik*=D[i];
            wynik%=mod;
        }
        if(m&1)
            wynik=(mod-wynik)%mod;
        cout<<wynik;
        return 0;
    }
    n=n-1,m=m-1;
    while(k>0)
    {
        if(n>=2&&(m<=0||D[n]*D[n-1]>U[m]*U[m-1])&&k%2==0&&k>=2)
        {
         //   cout<<"jeden"<<endl;
            wynik*=D[n];
            wynik%=mod;
            wynik*=D[n-1];
            wynik%=mod;
            n-=2;
            k-=2;
        }
        else if(n>=2&&(m<=0||D[n-1]*D[n-2]>U[m]*U[m-1])&&k>=2)
        {
           // cout<<"dwa"<<endl;
            wynik*=D[n];
            wynik%=mod;
            wynik*=D[n-1];
            wynik%=mod;
            n-=2;
            k-=2;
        }
        else if(m>=1&&(n<=0||U[m]*U[m-1]>=D[n]*D[n-1]||(n==2&&D[n-1]*D[n-2]<=U[m]*U[m-1]))&&k>=2)
        {
           // cout<<"trzy"<<endl;
            wynik*=U[m];
            wynik%=mod;
            wynik*=U[m-1];
            wynik%=mod;
            m-=2;
            k-=2;
        }
        else if(n==1&&k%2==0&&k>=2)
        {
            //cout<<"cztery"<<endl;
            wynik*=D[n];
            wynik%=mod;
            wynik*=D[n-1];
            wynik%=mod;
            n-=2;
            k-=2;
        }
        else if(k==1)
        {
           // cout<<"piec"<<endl;
            wynik*=D[n];
            wynik%=mod;
            n--;
            k--;
        }
    }
    cout<<wynik;
    return 0;
}


Measured memory_bytes: 5608