#include<bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
#include <functional> // for less 
using namespace __gnu_pbds; 
#define mod 1000000007 
#define int long long
#define ll long long
#define pb push_back
#define boost ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define inp(n) for(i=0;i<n;i++) cin>>A[i];
#define inz(A) memset(A,0,sizeof(A))
#define lb lower_bound
#define ub upper_bound
#define all(v) v.begin(),v.end()
#define T 1000005
#define F first
#define S second
#define pi pair<int,int>
#define vi vector<int>
#define mii map<int,int>
#define vp vector<pair< int,int> >
#define mpi map<pair<int,int> ,int>
#define PI M_PI
#define lower(s) transform(all(s),s.begin(),::tolower)
#define endl "\n"
typedef tree<int, null_type, less<int>, rb_tree_tag, 
         tree_order_statistics_node_update> pbds;
int add(int a, int b) {a=(a%mod + b%mod)%mod;return a;}
int sub(int a, int b) {a =(a%mod - b%mod + mod)%mod ;return a;}
int mul(int a, int b) {return (a%mod * b%mod) % mod;}
#define INF 1000000000000000000
 int power(int a,int x){a%=mod;
              int res=1;
		while(x>0){
		if(x&1)
		res=res*a%mod;
		a=a*a%mod;
                    x>>=1;  }
		return res;}
void solve()
{  
   int n,k;
    cin>>n>>k;int anss=1;vector<pi>a1;int m=INF,r=INF;vi ar,br;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        if(x>=0)a1.pb({x,1});
        else a1.pb({-x,2});
    }
    int x=0;
    sort(all(a1),greater<pi>());
    for(int i=0;i<k;i++)
    {
        if(a1[i].S==2){x++;r=a1[i].F;}
        else m=a1[i].F;
    }
    if(x%2==0)
    {
        for(int i=0;i<k;i++)
        {
            anss*=a1[i].F;
            anss%=mod;
        }
    }
    else
    {  
       if(r!=INF)br.pb(r);if(m!=INF)ar.pb(m);
        for(int i=k;i<n;i++)
        {
            if(a1[i].S==2)br.pb(a1[i].F);
            else ar.pb(a1[i].F);
        }
        if(br.size()>1&&ar.size()>1&&r!=INF&&m!=INF)
        {
            if(r*br[1]>ar[1]*m)
            {
            for(int i=0;i<k;i++)
        {
            anss*=a1[i].F;
            anss%=mod;
        }   
              anss*=power(m,mod-2);
              anss%=mod;
              anss*=br[1];
              anss%=mod;
            }
            else
            {
                for(int i=0;i<k;i++)
        {
            anss*=a1[i].F;
            anss%=mod;
        }   
              anss*=power(r,mod-2);
              anss%=mod;
              anss*=ar[1];
              anss%=mod;
            }
            
        }
        else if(m!=INF&&br.size()>1)
        {
         for(int i=0;i<k;i++)
        {
            anss*=a1[i].F;
            anss%=mod;
        }   
              anss*=power(m,mod-2);
              anss%=mod;
              anss*=br[1];
              anss%=mod;   
        }
       else if(m!=INF&&ar.size()>1)
            {
                 for(int i=0;i<k;i++)
        {
            anss*=a1[i].F;
            anss%=mod;
        }   
              anss*=power(r,mod-2);
              anss%=mod;
              anss*=ar[1];
              anss%=mod;
            }
            else if(m==INF&&ar.size()>0)
            {
                 for(int i=0;i<k;i++)
        {
            anss*=a1[i].F;
            anss%=mod;
        }   
              anss*=power(r,mod-2);
              anss%=mod;
              anss*=ar[0];
              anss%=mod;
            }
            else
            {
                
        for(int i=n-1;i>=n-k;i--)
        {
            anss*=a1[i].F;//cout<<a1[i].FI<<" ";
            anss%=mod;
        }
        anss=-anss;
        anss+=mod;
        anss%=mod;
            }
            
    }
    anss=(anss+mod)%mod;
    cout<<anss<<endl;
}

signed main()
{ 
    boost
    int test=0,t;
    //cin >> t ;
    t=1;
    while(test++ <t){
	  //cout<<"Case #"<<test<<": ";
	   solve();}
  
}

Measured memory_bytes: 7428