Problem p02616 (C++) — buggy submission, verdict: Runtime Error

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

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;
}

Error: 0

Fixed submission:

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

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;
    }

    if (minpi == -1) {
      if (maxpi == -1)
        exit(2);
      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;
    // }

    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 (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;
}