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

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

typedef long lint;
typedef long long llint;
typedef pair<int, int> pint;
typedef pair<long long, long long> pllint;
typedef tuple<long long, long long, long long> tllint;

// static const int MAX = 1e6;
// static const int NIL = -1;
// static const llint INF = 1<<21;
static const llint MOD = 1e9 + 7;

// rambda
// 第一要素が同一ならば第二要素の小さい方を返す
// return get<0>( x ) == get<0>( y ) ? get<1>( x ) < get<1>( y ) : get<0>( x ) >
// get<0>( y );
template <class T> void chmax(T &a, T b) {
  if (a < b) {
    a = b;
  }
}
template <class T> void chmin(T &a, T b) {
  if (a > b) {
    a = b;
  }
}

int main(void) {
  llint n, k;
  cin >> n >> k;

  vector<llint> a(n);
  vector<llint> p;
  vector<llint> m;
  llint cntminus = 0;
  for (llint in = 0; in < n; in++) {
    cin >> a[in];
    if (a[in] >= 0) {
      p.push_back(a[in]);
    } else {
      m.push_back(a[in]);
      cntminus++;
    }
  }

  llint ans = 1LL;
  if (n == k) {
    for (llint ik = 0; ik < k; ik++) {
      ans *= a[ik];
      ans %= MOD;
    }
    if (ans < 0)
      ans += MOD;
    cout << ans << endl;
    return 0;
  } else if (cntminus == n && k % 2 == 1) {
    sort(a.begin(), a.end(), greater<llint>());
    for (llint ik = 0; ik < k; ik++) {
      ans *= a[ik];
      ans %= MOD;
    }
    if (ans < 0)
      ans += MOD;
    cout << ans << endl;
    return 0;
  } else {
    sort(p.begin(), p.end(), greater<llint>());
    sort(m.begin(), m.end());

    vector<llint> s;
    llint st = 0;
    if (k % 2 == 1) {
      s.push_back(p[0]);
      k--;
      for (int i = 0; i < static_cast<int>(p.size()) - 1; i++) {
        p[i] = p[i + 1];
      }
      st = 1;
    }

    vector<tuple<llint, llint, llint>> pm2;
    for (llint i = 0; i < static_cast<int>(p.size() - st) / 2; i++) {
      pm2.push_back(
          make_tuple(p[2 * i] * p[2 * i + 1], p[2 * i], p[2 * i + 1]));
    }
    for (llint i = 0; i < static_cast<int>(m.size()) / 2; i++) {
      pm2.push_back(
          make_tuple(m[2 * i] * m[2 * i + 1], -m[2 * i], -m[2 * i + 1]));
    }

    sort(begin(pm2), end(pm2), greater<tllint>());
    for (int i = 0; i < k / 2; i++) {
      int mul1 = get<1>(pm2[i]);
      int mul2 = get<2>(pm2[i]);
      s.push_back(mul1);
      s.push_back(mul2);
    }
    for (auto is : s) {
      ans *= is;
      ans %= MOD;
    }
    if (ans < 0)
      ans += MOD;
    cout << ans << endl;
  }
  return 0;
}


Error: 0

Fixed submission:

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

typedef long lint;
typedef long long llint;
typedef pair<int, int> pint;
typedef pair<long long, long long> pllint;

// static const int MAX = 1e6;
// static const int NIL = -1;
// static const llint INF = 1<<21;
static const llint MOD = 1e9 + 7;

bool compPair(const pint &arg1, const pint &arg2) {
  return arg1.first > arg2.first;
}
template <class T> void chmax(T &a, T b) {
  if (a < b) {
    a = b;
  }
}
template <class T> void chmin(T &a, T b) {
  if (a > b) {
    a = b;
  }
}

int main(void) {
  llint n, k;
  cin >> n >> k;

  vector<llint> a(n);
  vector<llint> p;
  vector<llint> m;
  llint cntminus = 0;
  for (llint in = 0; in < n; in++) {
    cin >> a[in];
    if (a[in] >= 0) {
      p.push_back(a[in]);
    } else {
      m.push_back(a[in]);
      cntminus++;
    }
  }

  llint ans = 1LL;
  if (k == n) {
    for (llint ik = 0; ik < k; ik++) {
      ans *= a[ik];
      ans %= MOD;
    }
    if (ans < 0)
      ans += MOD;
    cout << ans << endl;
    return 0;
  } else if (cntminus == n && k % 2 == 1) {
    sort(a.begin(), a.end(), greater<llint>());
    for (llint ik = 0; ik < k; ik++) {
      ans *= a[ik];
      ans %= MOD;
    }
    if (ans < 0)
      ans += MOD;
    cout << ans << endl;
    return 0;
  } else {
    sort(p.begin(), p.end(), greater<llint>());
    sort(m.begin(), m.end());

    vector<llint> s;
    if (k % 2 == 1) {
      s.push_back(p[0]);
      k--;
      for (int i = 0; i < p.size() - 1; i++) {
        p[i] = p[i + 1];
      }
    }

    vector<llint> p2;
    vector<llint> m2;
    llint tmp;
    for (llint i = 0; i < (p.size() - 1) / 2; i++) {
      tmp = p[2 * i] * p[2 * i + 1];
      tmp %= MOD;
      p2.push_back(tmp);
    }
    for (llint i = 0; i < m.size() / 2; i++) {
      tmp = m[2 * i] * m[2 * i + 1];
      tmp %= MOD;
      m2.push_back(tmp);
    }

    llint ip = 0, im = 0;
    for (int i = 0; i < k / 2; i++) {
      if (ip >= p2.size()) {
        s.push_back(m2[im]);
        im++;
        continue;
      }
      if (im >= m2.size()) {
        s.push_back(p2[ip]);
        ip++;
        continue;
      }
      if (p2[ip] >= m2[im]) {
        s.push_back(p2[ip]);
        ip++;
      } else {
        s.push_back(m2[im]);
        im++;
      }
    }
    for (auto is : s) {
      ans *= is;
      ans %= MOD;
    }
    if (ans < 0)
      ans += MOD;
    cout << ans << endl;
  }
  return 0;
}