#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>
#include<vector>
#include<algorithm>
#include<utility>

using namespace std;

#define int long long
#define endl "\n"

constexpr long long INF = (long long)1e18;
constexpr long long MOD = 1'000'000'007; 

struct fast_io {
	fast_io(){
		std::cin.tie(nullptr);
		std::ios::sync_with_stdio(false);
	};
} fio;

long long power(long long x, long long n){
	long long ans = 1;
	for(;n;n >>= 1, x *= x, ans %= MOD, x %= MOD)
		if(n&1)ans*=x;
	return ans % MOD;
}
	
	
signed main(){
	cout<<fixed<<setprecision(10);
	
	int N, K;
	vector<int> A;
	vector<pair<int,int>> B;
	int p = 0, m = 0, z = 0;
	int ans = 1;
	
	cin>>N>>K;
	
	A.resize(N);
	
	for(int i = 0; i < N; i++){
		cin>>A[i];
		
		B.push_back({abs(A[i]), A[i]});
		
		if(A[i] > 0) p++;
		else if(A[i] == 0) z++;
		else m++;
	}
	
	if(K == 1) {
		
		sort(A.begin(), A.end(), greater<int>());
		
		ans = A[0];
		
	} else if(p == 0) {
		if(K%2 == 0) {
			sort(A.begin(), A.end());
			for(int i = 0; i < K; i++){ 
				ans *= abs(A[i]);
				ans %= MOD;
			}
		} else { 
			
			sort(A.begin(), A.end(), greater<int>());
			
			if(z >= 1) {
				ans = 0;
			} else {
				for(int i = 0; i < K; i++){
					ans *= abs(A[i]);
					ans %= MOD;
				}
				
				ans = (MOD - ans)%MOD;
			}
		}
	} else {
		sort(B.begin(), B.end(), greater<pair<int,int>>());
		
		int conm = 0, conz = 0;
		int minmi = -1, minpi = -1;
		int maxmi = -1, maxpi = -1;
		
		
		for(int i = 0; i < K; i++){
			if(B[i].second < 0) conm++;
			if(B[i].second == 0) conz++;
			ans *= B[i].first;
			ans %= MOD;
			ans = (ans%MOD + MOD) % MOD;
			if(B[i].second < 0) minmi = i;
			if(B[i].second > 0) minpi = i;
		}
		
		if(conm%2 == 0){
			cout<<ans<<endl;
			return 0;
		}
		if(conz) {
			cout<<0<<endl;
			return 0;
		}
		
		for(int i = K; i < N; i++){
			if(B[i].second > 0) {
				maxpi = i;
				break;
			}
		}
		
		for(int i = K; i < N; i++){
			if(B[i].second < 0) {
				maxmi = i;
				break;
			}
		}
		
		if(minpi == -1){
			ans *= B[maxpi].first;
			ans %= MOD;
			ans *= power(B[minmi].first, MOD-2);
			ans %= MOD;
			
			cout<<ans<<endl;
			return 0;
		}
		
		// if(K == N) {
			// cout<<(MOD-ans%MOD)%MOD<<endl;
			
			// return 0;
		// }
		
		
		
		
		if(maxmi == -1) {
			// exit(2);
			if(maxpi == -1) {
				// exit(2);
				if(z) ans =  0;
				else {
					ans = 1;
					for(int i = 0; i < K; i++){
						ans *= B[N-i-1].first;
						ans %= MOD;
					}
					
					ans = (MOD-ans%MOD)%MOD;
				}
				ans = (ans%MOD + MOD) % MOD;
				// cout<<ans<<endl;
				// return 0;
			} else { 
				ans *= B[maxpi].first;
				ans %= MOD;
				ans *= power(B[minmi].first, MOD-2);
				ans %= MOD;
				
			}
			ans = (ans%MOD + MOD) % MOD;
			
			cout<<ans<<endl;
			
			return 0;
			
		}
		
		if(maxpi == -1){
			
			if(maxmi == -1) {
				if(z) ans =  0;
				else {
					ans = 1;
					for(int i = 0; i < K; i++){
						ans *= B[N-i-1].first;
						ans %= MOD;
					}
					
					ans = (MOD-ans)%MOD;
				}
			} else {
				ans *= B[maxmi].first;
				ans %= MOD;
				ans *= power(B[minpi].first, MOD-2);
				ans %= MOD;
			}
			
			ans = (ans%MOD + MOD) % MOD;
			
			cout<<ans<<endl;
			
			return 0;
		}
		
		if(maxpi != -1 && maxmi != -1) {// cout<<"<><>"<<endl;
		
			int A = B[minpi].first;
			int BB = B[minmi].first;
			
			// int a = (-B[maxmi].first + B[minpi].first);
			// int b = (-B[maxpi].first + B[minmi].first);
			int a = B[maxmi].first;
			int b = B[maxpi].first;
			// cout<<B[minpi].first<<" - "<<B[maxmi].first<<endl;
			
			// cout<<a<<" "<<b<<endl;
			
			// if(!a || !b) {
				// ans %= MOD;
			// } else 
				
			if(BB * a > A * b) { 
				ans *= B[maxmi].first;
				ans %= MOD;
				ans *= power(B[minpi].first, MOD-2);
				ans %= MOD;
			} else {
				ans *= B[maxpi].first;
				ans %= MOD;
				ans *= power(B[minmi].first, MOD-2);
				ans %= MOD;
			}
			ans = (ans%MOD + MOD) % MOD;
		}
	}
	
	ans = (ans%MOD + MOD) % MOD;
	
	cout<<ans<<endl;
	
	return 0;
}

Measured memory_bytes: 8924