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

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

long long A[200005];
vector<long long> sign[2];
vector<long long> stack1[2];

const long long MOD = 1e9 + 7;

long long modpow(long long a, long long b) {
  if (b == 0) {
    return 1 % MOD;
  } else if (b == 1) {
    return a % MOD;
  } else {
    long long temp = modpow(a, b >> 1);
    if (b & 1) {
      return ((temp * temp % MOD) * a) % MOD;
    } else {
      return temp * temp % MOD;
    }
  }
}

int main() {
  int N, K;
  scanf("%d%d", &N, &K);

  bool zeroPossible = false;
  for (int i = 0; i < N; i++) {
    scanf("%lld", &A[i]);
    zeroPossible |= (A[i] == 0);

    if (A[i] > 0) {
      sign[0].push_back(A[i]);
    } else if (A[i] < 0) {
      sign[1].push_back(-A[i]);
    }
  }

  sort(sign[0].begin(), sign[0].end());
  sort(sign[1].begin(), sign[1].end());

  for (int i : sign[0]) {
    stack1[0].push_back(i);
  }
  for (int i : sign[1]) {
    stack1[1].push_back(i);
  }
  reverse(stack1[0].begin(), stack1[0].end());
  reverse(stack1[1].begin(), stack1[1].end());

  int indx0 = 0;
  int indx1 = stack1[1].size();
  while (stack1[1].size() > K / 2 * 2 || (stack1[1].size() & 1) == 1) {
    stack1[1].pop_back();
  }

  // printf("not done yet: indx0=%d stack1[1].size()=%d\\n", indx0,
  // (int)stack1[1].size());

  long long current_product = 1;
  for (long long i : stack1[1]) {
    current_product = current_product * i % MOD;
  }

  while (indx0 + stack1[1].size() < K && indx0 < (int)stack1[0].size()) {
    current_product = current_product * stack1[0][indx0] % MOD;
    indx0++;
  }
  // printf("indx0=%d stack1[1].size()=%d\\n", indx0, (int)stack1[1].size());

  if (indx0 + (int)stack1[1].size() < K) {
    if (zeroPossible) {
      printf("0");
      return 0;
    }

    stack1[0].clear();
    stack1[1].clear();
    for (int i : sign[0]) {
      stack1[0].push_back(i);
    }
    for (int i : sign[1]) {
      stack1[1].push_back(i);
    }

    int indx0 = 0;
    int indx1 = stack1[1].size();
    while (stack1[1].size() > 1 + (K - 1) / 2 * 2 ||
           stack1[1].size() % 2 == 0) {
      stack1[1].pop_back();
    }

    // printf("Negative: %d %d\\n", indx0, (int)stack1[1].size());

    long long current_product = MOD - 1;
    for (long long i : stack1[1]) {
      current_product = current_product * i % MOD;
    }

    while (indx0 + stack1[1].size() < K && indx0 < (int)stack1[0].size()) {
      current_product = current_product * stack1[0][indx0] % MOD;
      indx0++;
    }

    while (indx0 + 2 <= (int)stack1[0].size() && (int)stack1[1].size() >= 2) {
      long long x1 = stack1[1].back();
      stack1[1].pop_back();
      long long x2 = stack1[1].back();
      stack1[1].pop_back();

      long long toDivide = x1 * x2;
      long long toMultiply = stack1[0][indx0] * stack1[0][indx0 + 1];
      // printf("debug: %lld %lld\\n", toMultiply, toDivide);
      if (toMultiply <= toDivide) {
        current_product = (current_product) * (toMultiply % MOD) % MOD;
        current_product =
            (current_product) * (modpow(toDivide % MOD, MOD - 2)) % MOD;
        indx0 += 2;
      } else {
        break;
      }
    }

    printf("%lld", current_product);
    return 0;
  }

  // printf("Here");

  while (indx0 + 2 <= (int)stack1[0].size() && (int)stack1[1].size() >= 2) {
    long long x1 = stack1[1].back();
    stack1[1].pop_back();
    long long x2 = stack1[1].back();
    stack1[1].pop_back();

    long long toDivide = x1 * x2;
    long long toMultiply = stack1[0][indx0] * stack1[0][indx0 + 1];
    // printf("debug: %lld %lld\\n", toMultiply, toDivide);
    if (toMultiply >= toDivide) {
      current_product = (current_product) * (toMultiply % MOD) % MOD;
      current_product =
          (current_product) * (modpow(toDivide % MOD, MOD - 2)) % MOD;
      indx0 += 2;
    } else {
      break;
    }
  }

  printf("%lld", current_product);
  return 0;
}


Error: WA

Fixed submission:

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

long long A[200005];
vector<long long> sign[2];
vector<long long> stack1[2];

const long long MOD = 1e9 + 7;

long long modpow(long long a, long long b) {
  if (b == 0) {
    return 1 % MOD;
  } else if (b == 1) {
    return a % MOD;
  } else {
    long long temp = modpow(a, b >> 1);
    if (b & 1) {
      return ((temp * temp % MOD) * a) % MOD;
    } else {
      return temp * temp % MOD;
    }
  }
}

int main() {
  int N, K;
  scanf("%d%d", &N, &K);

  bool zeroPossible = false;
  for (int i = 0; i < N; i++) {
    scanf("%lld", &A[i]);
    zeroPossible |= (A[i] == 0);

    if (A[i] > 0) {
      sign[0].push_back(A[i]);
    } else if (A[i] < 0) {
      sign[1].push_back(-A[i]);
    }
  }

  sort(sign[0].begin(), sign[0].end());
  sort(sign[1].begin(), sign[1].end());

  for (int i : sign[0]) {
    stack1[0].push_back(i);
  }
  for (int i : sign[1]) {
    stack1[1].push_back(i);
  }
  reverse(stack1[0].begin(), stack1[0].end());
  reverse(stack1[1].begin(), stack1[1].end());

  int indx0 = 0;
  int indx1 = stack1[1].size();
  while (stack1[1].size() > K / 2 * 2 || (stack1[1].size() & 1) == 1) {
    stack1[1].pop_back();
  }

  // printf("not done yet: indx0=%d stack1[1].size()=%d\\n", indx0,
  // (int)stack1[1].size());

  long long current_product = 1;
  for (long long i : stack1[1]) {
    current_product = current_product * i % MOD;
  }

  while (indx0 + stack1[1].size() < K && indx0 < (int)stack1[0].size()) {
    current_product = current_product * stack1[0][indx0] % MOD;
    indx0++;
  }
  // printf("indx0=%d stack1[1].size()=%d\\n", indx0, (int)stack1[1].size());

  if (indx0 + (int)stack1[1].size() < K) {
    if (zeroPossible) {
      printf("0");
      return 0;
    }
    throw;

    stack1[0].clear();
    stack1[1].clear();
    for (int i : sign[0]) {
      stack1[0].push_back(i);
    }
    for (int i : sign[1]) {
      stack1[1].push_back(i);
    }

    int indx0 = 0;
    int indx1 = stack1[1].size();
    while (stack1[1].size() > 1 + (K - 1) / 2 * 2) {
      stack1[1].pop_back();
    }

    long long current_product = MOD - 1;
    for (long long i : stack1[1]) {
      current_product = current_product * i % MOD;
    }

    while (indx0 + stack1[1].size() < K && indx0 < (int)stack1[0].size()) {
      current_product = current_product * stack1[0][indx0] % MOD;
      indx0++;
    }

    while (indx0 + 2 <= (int)stack1[0].size() && (int)stack1[1].size() >= 2) {
      long long x1 = stack1[1].back();
      stack1[1].pop_back();
      long long x2 = stack1[1].back();
      stack1[1].pop_back();

      long long toDivide = x1 * x2;
      long long toMultiply = stack1[0][indx0] * stack1[0][indx0 + 1];
      // printf("debug: %lld %lld\\n", toMultiply, toDivide);
      if (toMultiply <= toDivide) {
        current_product = (current_product) * (toMultiply % MOD) % MOD;
        current_product =
            (current_product) * (modpow(toDivide % MOD, MOD - 2)) % MOD;
        indx0 += 2;
      } else {
        break;
      }
    }

    printf("%lld", current_product);
    return 0;
  }

  // printf("Here");

  while (indx0 + 2 <= (int)stack1[0].size() && (int)stack1[1].size() >= 2) {
    long long x1 = stack1[1].back();
    stack1[1].pop_back();
    long long x2 = stack1[1].back();
    stack1[1].pop_back();

    long long toDivide = x1 * x2;
    long long toMultiply = stack1[0][indx0] * stack1[0][indx0 + 1];
    // printf("debug: %lld %lld\\n", toMultiply, toDivide);
    if (toMultiply >= toDivide) {
      current_product = (current_product) * (toMultiply % MOD) % MOD;
      current_product =
          (current_product) * (modpow(toDivide % MOD, MOD - 2)) % MOD;
      indx0 += 2;
    } else {
      break;
    }
  }

  printf("%lld", current_product);
  return 0;
}