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

#include <bits/stdc++.h>
using namespace std;
#define rep(i, N) for (int i = 0; i < N; i++)
typedef long long ll;
#define dump(x) cerr << #x << "=" << x << endl
using P = pair<int, int>;

ll mod = 1e9 + 7;

int main() {
  ll n, k;
  cin >> n >> k;
  vector<ll> a(n);
  bool minus = true;
  rep(i, n) {
    cin >> a.at(i);
    if (a.at(i) >= 0)
      minus = false;
  }

  if (minus) {
    ll ans = 1;
    sort(a.begin(), a.end());
    if (k % 2 != 0) {
      sort(a.rbegin(), a.rend());
    }
    rep(i, k) {
      ans *= (mod + a.at(i));
      ans %= mod;
    }
    cout << ans << endl;
    return 0;
  }

  vector<pair<ll, ll>> c;
  rep(i, n) {
    int tt = 1;
    if (a.at(i) < 0)
      tt = 0;
    c.push_back(make_pair((ll)abs(a.at(i)), tt));
  }

  sort(c.rbegin(), c.rend());
  ll ans1 = 1;
  int t = 1;
  rep(i, k) {
    ans1 *= (c.at(i).first);
    ans1 %= mod;
    t ^= c.at(i).second;
    t = !t;
  }

  dump(1);
  if (k == 1) {
    sort(a.rbegin(), a.rend());
    cout << a.at(0) << endl;
    return 0;
  }

  if (n == k) {
    ll ans7 = 1;
    rep(i, n) {
      ans7 *= (mod + a.at(i));
      ans7 %= mod;
    }
    cout << ans7 << endl;
    return 0;
  }

  dump(2);
  if (t == 1) {
    dump(3);
    cout << ans1 << endl;
    return 0;
  } else {
    dump(4);
    bool minus1 = true;
    rep(i, k) {
      if (c.at(i).second == 1) {
        minus1 = false;
      }
    }
    if (minus1) {
      dump(5);
      ll ans3 = 1;
      rep(i, k - 1) {
        ans3 *= (c.at(i).first);
        ans3 %= mod;
      }
      for (int i = k; i < n; i++) {
        if (c.at(i).second) {
          ans3 *= (c.at(i).first);
          ans3 %= mod;
          break;
        }
      }
      cout << ans3 << endl;
      return 0;
    } else {
      ll ans4 = 1;
      ll ans5 = 1;
      int id0 = -1, id1 = -1;
      rep(i, k) {
        if (c.at(i).second) {
          id0 = i;
        } else {
          id1 = i;
        }
      }

      rep(i, k) {
        if (i != id0)
          ans4 *= (c.at(i).first);
        if (i != id1)
          ans5 *= (c.at(i).first);
        ans4 %= mod;
        ans5 %= mod;
      }

      int id2 = -1, id3 = -1;
      for (int i = k; i < n; i++) {
        if (c.at(i).second == 0) {
          ans4 *= (c.at(i).first);
          ans4 %= mod;
          id2 = i;
          break;
        }
      }

      for (int i = k; i < n; i++) {
        if (c.at(i).second) {
          ans5 *= (c.at(i).first);
          ans5 %= mod;
          id3 = i;
          break;
        }
      }

      if (id2 == -1) {
        cout << ans5 << endl;
        return 0;
      }

      if (id3 == -1) {
        cout << ans4 << endl;
        return 0;
      }

      if (c.at(id3).first * c.at(id0).first >
          c.at(id1).first * c.at(id2).first) {
        cout << ans5 << endl;
      } else {
        cout << ans4 << endl;
      }
      return 0;
    }
  }

  return 0;
}


Error: 0
t=0
t=1


Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define rep(i, N) for (int i = 0; i < N; i++)
typedef long long ll;
#define dump(x) cerr << #x << "=" << x << endl
using P = pair<int, int>;

ll mod = 1e9 + 7;

int main() {
  ll n, k;
  cin >> n >> k;
  vector<ll> a(n);
  rep(i, n) { cin >> a.at(i); }

  vector<pair<ll, int>> b;
  rep(i, n) {
    int t;
    if (a.at(i) < 0) {
      t = 0;
    } else {
      t = 1;
    }
    b.push_back(make_pair((ll)abs(a.at(i)), t));
  }

  sort(b.rbegin(), b.rend());
  if (k == 1) {
    cout << b.at(0).first << endl;
    ;
    return 0;
  }

  int t = 1;
  ll ans = 1;
  rep(i, k) {
    ans *= b.at(i).first;
    ans %= mod;
    t ^= b.at(i).second;
    t = !t;
    dump(t);
  }

  if (t == 1) {
    cout << ans << endl;
    return 0;
  }

  int idp = -1, idm = 0;
  rep(i, k) {
    if (b.at(i).second == 1) {
      idp = i;
    } else {
      idm = i;
    }
  }

  if (idp == -1) {
    dump(1);
    int idtmp = -1;
    for (int i = k; i < n; i++) {
      if (b.at(i).second == 1) {
        idtmp = i;
        break;
      }
    }
    ll ansm = 1;
    if (idtmp == -1) {
      int cnttmp = 0;
      for (int i = n - 1; i >= 0; i--) {
        if (cnttmp == k)
          break;
        dump(b.at(i).first);
        ansm *= b.at(i).first;
        ansm %= mod;
        cnttmp++;
      }
      ansm *= -1;
      ansm += mod;
      cout << ansm << endl;
      return 0;
    } else {
      rep(i, k) {
        if (i == idm)
          continue;
        ansm *= b.at(i).first;
        ansm %= mod;
      }
      ansm *= b.at(idtmp).first;
      ansm %= mod;
      if (ansm < 0)
        ansm += mod;
      cout << ansm << endl;
      return 0;
    }
  } else {
    int idtmp = -1;
    for (int i = k; i < n; i++) {
      if (b.at(i).second == 1) {
        idtmp = i;
        break;
      }
    }
    ll ansm = 1;
    if (idtmp == -1) {
      int tmpp = 0;
      for (int i = n - 1; i >= 0; i--) {
        if (tmpp == k)
          break;
        ansm *= b.at(i).first;
        ansm %= mod;
        tmpp++;
      }
      ansm *= -1ll;
      ansm += mod;
      cout << ansm << endl;
    } else {
      rep(i, k) {
        if (i == idm)
          continue;
        ansm *= b.at(i).first;
        ansm %= mod;
      }
      ansm *= b.at(idtmp).first;
      ansm %= mod;
      if (ansm < 0)
        ansm += mod;
    }

    ll ansp = -1;
    idtmp = -1;
    for (int i = k; i < n; i++) {
      if (b.at(i).second == 0) {
        idtmp = i;
        break;
      }
    }
    rep(i, k) {
      if (i == idp)
        continue;
      ansp *= b.at(i).first;
      ansp %= mod;
    }
    ansp *= b.at(idtmp).first;
    ansp %= mod;
    ansp = max(ansp, ansm);
    if (ansp < 0)
      ansp += mod;
    cout << ansp << endl;
  }

  return 0;
}