#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

ll mod = 1e9 + 7;

int main()
{
	int n, k;
	cin >> n >> k;
	vector<ll> mosbat, manfi;
	for (int i = 0; i < n; i++)
	{
		ll x;
		cin >> x;
		if (x >= 0)
		{
			mosbat.push_back(x);
			continue;
		}
		manfi.push_back(-x);
	}
	sort(mosbat.begin(), mosbat.end());
	sort(manfi.begin(), manfi.end());
	if (mosbat.size() == 0)
	{
		ll maj = 1;
		if (k % 2 == 0)
		{
			for (int i = manfi.size() - k; i < manfi.size(); i++)
			{
				maj *= manfi[i];
				maj %= mod;
			}
			cout << maj;
			return 0;
		}
		for (int i = 0; i < k; i++)
		{
			maj *= manfi[i];
			maj %= mod;
		}
		maj = mod - maj;
		if (maj == n) maj = 0;
		cout << maj;
		return 0;
	}
	if (manfi.size() == 0)
	{
		ll maj = 1;
		for (int i = mosbat.size() - k; i < mosbat.size(); i++)
		{
			maj *= mosbat[i];
			maj %= mod;
		}
		cout << maj;
		return 0;
	}
	if (n == k)
	{
		ll maj = 1;
		for (int i = 0; i < mosbat.size(); i++)
		{
			maj *= mosbat[i];
			maj %= mod;
		}
		for (int i = 0; i < manfi.size(); i++)
		{
			maj *= manfi[i];
			maj %= mod;
		}
		if (manfi.size() % 2 == 1) maj = mod - maj;
		if (maj == mod) maj = 0;
		cout << maj;
		return 0;
	}
	vector<pair<ll, ll>> all;
	for (int i = 0; i < mosbat.size(); i++)
	{
		all.push_back(make_pair(mosbat[i], 0));
	}
	for (int i = 0; i < manfi.size(); i++)
	{
		all.push_back(make_pair(manfi[i], 1));
	}
	sort(all.begin(), all.end());
	ll maj = 1;
	int t = 0;
	int f = 0;
	for (int i = all.size() - k; i < all.size(); i++)
	{
		if (all[i].second) t++;
		if (all[i].first == 0) f = 1;
	}
	if (f)
	{
		cout << 0;
		return 0;
	}
	if (t % 2 == 0)
	{
		for (int i = all.size() - k; i < all.size(); i++)
		{
			maj *= all[i].first;
			maj %= mod;
		}
		cout << maj;
		return 0;
	}
	if (t == k)
	{
		for (int i = all.size() - (k - 1); i < all.size(); i++)
		{
			maj *= all[i].first;
			maj %= mod;
		}	
		maj *= mosbat.back();
		maj %= mod;
		cout << maj;
		return 0;
	}
	int indx_manfi = -1, indx_mosbat = -1;
	for (int i = all.size() - k; i < all.size(); i++)
	{
		if (all[i].second)
		{
			indx_manfi = i;
			break;
		}
	}
	for (int i = all.size() - k; i < all.size(); i++)
	{
		if (!all[i].second)
		{
			indx_mosbat = i;
			break;
		}
	}
	ll maj1 = all[indx_manfi].first, maj2 = all[indx_mosbat].first;
	int indman = -1, indmos = -1;
	for (int i = all.size() - k - 1; i > -1; i--)
	{
		if (all[i].second)
		{
			maj1 *= all[i].first;
			indman = i;
			break;
		}
	}
	for (int i = all.size() - k - 1; i > -1; i--)
	{
		if (!all[i].second)
		{
			maj2 *= all[i].first;
			indmos = i;
			break;
		}
	}
	if (indman == -1)
	{
		maj = all[indmos].first;
		maj %= mod;
		for (int i = all.size() - k; i < all.size(); i++)
		{
			if (i == indx_manfi) continue;
			maj *= all[i].first;
			maj %= mod;
		}
		cout << maj;
		return 0;
	}
	if (indmos == -1)
	{
		maj = all[indman].first;
		maj %= mod;
		for (int i = all.size() - k; i < all.size(); i++)
		{
			if (i == indx_mosbat) continue;
			maj *= all[i].first;
			maj %= mod;
		}
		cout << maj;
		return 0;
	}
	maj = max(maj1, maj2);
	maj %= mod;
	for (int i = all.size() - k; i < all.size(); i++)
	{
		if (i == indx_manfi || i == indx_mosbat) continue;
		maj *= all[i].first;
		maj %= mod;
	}
	cout << maj;
}


Measured memory_bytes: 10420