Language: C++

#include<algorithm>//sort,二分探索,など
#include<bitset>//固定長bit集合
#include<cmath>//pow,logなど
#include<complex>//複素数
#include<deque>//両端アクセスのキュー
#include<functional>//sortのgreater
#include<iomanip>//setprecision(浮動小数点の出力の誤差)
#include<iostream>//入出力
#include<iterator>//集合演算(積集合,和集合,差集合など)
#include<map>//map(辞書)
#include<numeric>//iota(整数列の生成),gcdとlcm(c++17)
#include<queue>//キュー
#include<set>//集合
#include<stack>//スタック
#include<string>//文字列
#include<unordered_map>//イテレータあるけど順序保持しないmap
#include<unordered_set>//イテレータあるけど順序保持しないset
#include<utility>//pair
#include<vector>//可変長配列

#define rep(i,n) for (int i = 0; i < (n); ++i)
#define erep(i,n) for (int i = 1; i <= (n); ++i)
#define brep(i,n) for (int i = n; i >= 0; i--)
#define pb push_back
using namespace std;
using P = pair<int,int>;
using ll = long long;
using Graph = vector<vector<int> > ;

const double PI=3.14159265358979323846;
const int INF = 100005;
const int MAX_K = 55;
const int MAX_W = 200005; 
const int MAX = 510000;
const int MOD = 1000000007;
long long fac[MAX], finv[MAX], inv[MAX];



// ユークリッド互除法
unsigned gcd(unsigned a, unsigned b) {
  while(1) {
    if(a < b) swap(a, b);
    if(!b) break;
    a %= b;
  }
  return a;
}

// テーブルを作る前処理
void COMinit() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i < MAX; i++){
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}

// 二項係数計算
long long COM(int n, int k){
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}

/*
int main() {
    // 前処理
    COMinit();

    // 計算例
    cout << COM(100000, 50000) << endl;
}
*/

struct mint {
  ll x; // typedef long long ll;
  mint(ll x=0):x((x%MOD+MOD)%MOD){}
  mint operator-() const { return mint(-x);}
  mint& operator+=(const mint a) {
    if ((x += a.x) >= MOD) x -= MOD;
    return *this;
  }
  mint& operator-=(const mint a) {
    if ((x += MOD-a.x) >= MOD) x -= MOD;
    return *this;
  }
  mint& operator*=(const mint a) { (x *= a.x) %= MOD; return *this;}
  mint operator+(const mint a) const { return mint(*this) += a;}
  mint operator-(const mint a) const { return mint(*this) -= a;}
  mint operator*(const mint a) const { return mint(*this) *= a;}
  mint pow(ll t) const {
    if (!t) return 1;
    mint a = pow(t>>1);
    a *= a;
    if (t&1) a *= *this;
    return a;
  }

  // for prime MOD
  mint inv() const { return pow(MOD-2);}
  mint& operator/=(const mint a) { return *this *= a.inv();}
  mint operator/(const mint a) const { return mint(*this) /= a;}
};
istream& operator>>(istream& is, const mint& a) { return is >> a.x;}
ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}

struct UnionFind {
    vector<int> par;
    vector<int> rank;
    vector<ll> Size;
    UnionFind(int n = 1) {
        init(n);
    }
 
    void init(int n = 1) {
        par.resize(n + 1); rank.resize(n + 1); Size.resize(n + 1);
        for (int i = 0; i <= n; ++i) par[i] = i, rank[i] = 0, Size[i] = 1;
    }
 
    int root(int x) {
        if (par[x] == x) {
            return x;
        }
        else {
            int r = root(par[x]);
            return par[x] = r;
        }
    }
 
    bool issame(int x, int y) {
        return root(x) == root(y);
    }
 
    bool merge(int x, int y) {
        x = root(x); y = root(y);
        if (x == y) return false;
        if (rank[x] < rank[y]) swap(x, y);
        if (rank[x] == rank[y]) ++rank[x];
        par[y] = x;
        Size[x] += Size[y];
        return true;
    }
 
    ll size(int x){
        return Size[root(x)];
    }
};



/*素因数分解*/
vector<pair<long long, long long> > prime_factorize(long long N) {
    vector<pair<long long, long long> > res;
    for (long long a = 2; a * a <= N; ++a) {
        if (N % a != 0) continue;
        long long ex = 0; // 指数

        // 割れる限り割り続ける
        while (N % a == 0) {
            ++ex;
            N /= a;
        }
        // その結果を push
        res.push_back({a, ex});
    }

    // 最後に残った数について
    if (N != 1) res.push_back({N, 1});
    return res;
}



int main(){
    mint ans = 1;
    int k,n;
    vector<ll> p;
    vector<ll> m;
    int pn = 0;
    int mn = 0;
    bool ex_zero = false;
    cin >> n >> k;
    rep(i,n){
        int a;
        cin >> a;
        if(a > 0){
            pn++;
            p.pb(a);
        }
        else if(a < 0){
            mn++;
            m.pb(abs(a));
        }
        else if(a == 0){
            ex_zero = ture;
        }
    }

    if(pn+mn < k){
        cout << 0 << endl;
        return 0;
    }

    if(pn == 0){
        if(k%2==0){
            sort(m.begin(),m.end(),greater<int>());
            rep(i,k) ans *= m[i];
            cout << ans << endl;
        }
        else if(k%2==1){
            if(ex_zero){
                cout << 0 << endl;
            }
            sort(m.begin(),m.end());
            rep(i,k) ans *= m[i];
            ans *= -1;
            cout << ans << endl;
        }
        return 0;
    }

    //pn .ne. 0
    sort(p.begin(),p.end(),greater<int>());
    sort(m.begin(),m.end(),greater<int>());

    if(k%2==0){
        int ind = -1;
        if(mn<2) ind = k/2-1;
        else{
            rep(i,k/2){
                if(2*i > pn) break;
                if(k-2*(i-1) > mn) continue;
                if(p[2*i]*p[2*i+1] > m[2*(k/2-i-2)]*m[2*(k/2-i-2)+1]){
                    ind = i;
                }
                else break;
            }
        }

        //cout << ans << endl;
        //cout << ind << endl;

        rep(i,2*ind+1) ans *= p[i];
        rep(i,k-2*(ind+1)) ans *= m[i]; 
    }
    else if(k%2==1){
        int ind = -1;
        ans *= p[0];
        if(mn<2) ind = (k-3)/2;
        else{
            rep(i,k/2){
                if(2*i > pn) break;
                if(k-2*(i-1) > mn) continue;
                if(p[2*i+1]*p[2*i+2] > m[2*(k/2-i-2)]*m[2*(k/2-i-2)+1]){
                    ind = i;
                }
                else break;
            }
        }
        rep(i,2*ind+1) ans *= p[i+1];
        rep(i,(k-1)-2*(ind+1)) ans *= m[i]; 
    }

    cout << ans << endl;


}

Compiler output:
a.cc: In function 'int main()':
a.cc:199:23: error: 'ture' was not declared in this scope
  199 |             ex_zero = ture;
      |                       ^~~~