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

#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;

int main() {
  ll ans = 1;
  ll posAn = 0;
  ll negAn = 0;
  int mod = 1000000007;
  vector<int>::iterator itrPos, itrNeg;
  int n;
  cin >> n;
  int k;
  cin >> k;
  // 整数入力
  // 正の数(ゼロを含む)・負の数に分ける
  vector<int> aPos = {};
  int aPosNum = 0;
  vector<int> aNeg = {};
  int aNegNum = 0;
  int aVal;
  // 数字入力
  rep(i, n) {
    cin >> aVal;
    if (aVal >= 0) {
      aPosNum++;
      aPos.push_back(aVal);
    } else if (aVal < 0) {
      aNegNum++;
      aNeg.push_back(aVal);
    }
  }
  // kが奇数
  if (k % 2 != 0) {
    // 正の数が含まれない
    if (aPosNum == 0) {
      sort(aNeg.begin(), aNeg.end(), greater<>());
      rep(i, k) {
        ans = ans * aNeg[i];
        ans = ans % mod;
      }
    }
    // 正の数が含まれる
    else {
      sort(aPos.begin(), aPos.end(), greater<>());
      // 一番大きい正の数をかける
      ans = ans * aPos[0];
      ans = ans % mod;
      // 一番最初の数を削除
      aPos.erase(aPos.begin() + 0);
      // kが偶数になる
      k--;
      aPosNum--;
    }
  }
  // kが偶数の時
  if (k % 2 == 0) {
    sort(aPos.begin(), aPos.end(), greater<>());
    sort(aNeg.begin(), aNeg.end(), greater<>());
    while (k > 0) {
      // すべてを掛け合わせるとき
      if (aPosNum + aNegNum == k) {
        rep(i, aPosNum) {
          ans = ans * aPos[i];
          ans = ans % mod;
        }
        rep(i, aNegNum) {
          ans = ans * aNeg[i];
          ans = ans % mod;
        }
        k = 0;
      }
      // 全てかけ合わせないとき
      else {
        // 正の数が2つ以上ある
        if (aPosNum >= 2) {
          // 負の数が2つ以上ある
          if (aNegNum >= 2) {
            itrPos = aPos.begin();
            itrNeg = aNeg.end();
            posAn = (ll)(*itrPos) * (ll)(*(itrPos + 1));
            // posAn = posAn % mod;
            negAn = (ll)(aNeg[aNeg.size() - 1]) * (ll)(aNeg[aNeg.size() - 2]);
            // negAn = negAn % mod;
            // 正の数2つの積 >= 負の数2つの積
            if (posAn >= negAn) {
              posAn = posAn % mod;
              ans = ans * posAn;
              ans = ans % mod;
              k = k - 2;
              // 正の数の大きい数2つを消す
              aPos.erase(aPos.begin() + 0, aPos.begin() + 2);
              aPosNum = aPosNum - 2;
            }
            // 正の数2つの積 < 負の数2つの積
            else {
              negAn = negAn % mod;
              ans = ans * negAn;
              ans = ans % mod;
              k = k - 2;
              // 負の数の小さい数2つを消す
              aNeg.erase(aNeg.end() - 2, aNeg.end());
              aNegNum = aNegNum - 2;
            }
          }
          // 負の数が2つ以上ない
          else {
            itrPos = aPos.begin();
            posAn = (ll)(*itrPos) * (ll)(*(itrPos + 1));
            posAn = posAn % mod;
            ans = ans * posAn;
            ans = ans % mod;
            k = k - 2;
            // 正の数の大きい数2つを消す
            aPos.erase(aPos.begin(), aPos.begin() + 2);
            aPosNum = aPosNum - 2;
          }
        }
        // 正の数が2つ以上ない
        else {
          itrNeg = aNeg.end();
          negAn = (ll)(aNeg[aNeg.size() - 1]) * (ll)(aNeg[aNeg.size() - 2]);
          negAn = negAn % mod;
          ans = ans * negAn;
          ans = ans % mod;
          k = k - 2;
          // 負の数の小さい数2つを消す
          aNeg.erase(aNeg.end() - 2, aNeg.end());
          aNegNum = aNegNum - 2;
        }
      }
    }
  }
  // ansが負の時
  if (ans < 0) {
    ans = ans + mod;
  }
  cout << ans << endl;
  return 0;
}

Error: -6
free(): invalid pointer


Fixed submission:

#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;

int main() {
  ll ans = 1;
  ll posAn = 0;
  ll negAn = 0;
  vector<int>::iterator itrPos, itrNeg;
  int n;
  cin >> n;
  int k;
  cin >> k;
  // 整数入力
  // 正の数(ゼロを含む)・負の数に分ける
  vector<int> aPos = {};
  int aPosNum = 0;
  vector<int> aNeg = {};
  int aNegNum = 0;
  int aVal;
  // 数字入力
  rep(i, n) {
    cin >> aVal;
    if (aVal >= 0) {
      aPosNum++;
      aPos.push_back(aVal);
    } else if (aVal < 0) {
      aNegNum++;
      aNeg.push_back(aVal);
    }
  }
  // kが奇数
  if (k % 2 != 0) {
    // 正の数が含まれない
    if (aPosNum == 0) {
      sort(aNeg.begin(), aNeg.end(), greater<>());
      rep(i, k) {
        ans = ans * aNeg[i];
        ans = ans % (1000000000 + 7);
      }
    }
    // 正の数が含まれる
    else {
      sort(aPos.begin(), aPos.end(), greater<>());
      // 一番大きい正の数をかける
      ans = ans * aPos[0];
      ans = ans % (1000000000 + 7);
      // 一番最初の数を削除
      aPos.erase(aPos.begin() + 0);
      // kが偶数になる
      k--;
      aPosNum--;
    }
  }
  if (k % 2 == 0) {
    while (k > 0) {
      // すべてを掛け合わせるとき
      if (aPosNum + aNegNum == k) {
        rep(i, aPosNum) {
          ans = ans * aPos[i];
          ans = ans % (1000000000 + 7);
        }
        rep(i, aNegNum) {
          ans = ans * aNeg[i];
          ans = ans % (1000000000 + 7);
        }
        k = 0;
      }
      // 全てかけ合わせないとき
      else {
        // 正の数が2つ以上ある
        if (aPosNum >= 2) {
          // 負の数が2つ以上ある
          if (aNegNum >= 2) {
            itrPos = aPos.begin();
            itrNeg = aNeg.end();
            posAn = (ll)(*itrPos) * (ll)(*(itrPos + 1));
            negAn = (ll)(aNeg[aNeg.size() - 1]) * (ll)(aNeg[aNeg.size() - 2]);
            // 正の数2つの積 >= 負の数2つの積
            if (posAn >= negAn) {
              ans = ans * (posAn % (1000000000 + 7));
              ans = ans % (1000000000 + 7);
              k = k - 2;
              // 正の数の大きい数2つを消す
              aPos.erase(aPos.begin() + 0, aPos.begin() + 2);
              aPosNum = aPosNum - 2;
            }
            // 正の数2つの積 < 負の数2つの積
            else {
              ans = ans * (negAn % (1000000000 + 7));
              ans = ans % (1000000000 + 7);
              k = k - 2;
              // 負の数の小さい数2つを消す
              aNeg.erase(aNeg.begin() + aNeg.size() - 3,
                         aNeg.begin() + aNeg.size() - 1);
              aNegNum = aNegNum - 2;
            }
          }
          // 負の数が2つ以上ない
          else {
            itrPos = aPos.begin();
            posAn = (ll)(*itrPos) * (ll)(*(itrPos + 1));
            ans = ans * (posAn % (1000000000 + 7));
            ans = ans % (1000000000 + 7);
            k = k - 2;
            // 正の数の大きい数2つを消す
            aPos.erase(aPos.begin(), aPos.begin() + 2);
            aPosNum = aPosNum - 2;
          }
        }
        // 正の数が2つ以上ない
        else {
          itrNeg = aNeg.end();
          negAn = (ll)(aNeg[aNeg.size() - 1]) * (ll)(aNeg[aNeg.size() - 2]);
          ans = ans * (negAn % (1000000000 + 7));
          ans = ans % (1000000000 + 7);
          k = k - 2;
          // 負の数の小さい数2つを消す
          aNeg.erase(aNeg.begin() + aNeg.size() - 3,
                     aNeg.begin() + aNeg.size() - 1);
          aNegNum = aNegNum - 2;
        }
      }
    }
  }
  if (ans < 0) {
    ans = ans + 1000000000 + 7;
  }
  cout << ans << endl;
  return 0;
}